
<!DOCTYPE HTML>
<html lang="" >
    <head>
        <meta charset="UTF-8">
        <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
        <title>日志系统的设计 · 高性能服务器开发 技术专栏</title>
        <meta http-equiv="X-UA-Compatible" content="IE=edge" />
        <meta name="description" content="">
        <meta name="generator" content="GitBook 3.2.3">
        <meta name="author" content="easy_coder">
        
        
    
    <link rel="stylesheet" href="../../gitbook/style.css">

    
            
                
                <link rel="stylesheet" href="../../gitbook/gitbook-plugin-chapter-fold/chapter-fold.css">
                
            
                
                <link rel="stylesheet" href="../../gitbook/gitbook-plugin-search-pro/search.css">
                
            
                
                <link rel="stylesheet" href="../../gitbook/gitbook-plugin-splitter/splitter.css">
                
            
                
                <link rel="stylesheet" href="../../gitbook/gitbook-plugin-back-to-top-button/plugin.css">
                
            
                
                <link rel="stylesheet" href="../../gitbook/gitbook-plugin-prism/prism.css">
                
            
                
                <link rel="stylesheet" href="../../gitbook/gitbook-plugin-tbfed-pagefooter/footer.css">
                
            
                
                <link rel="stylesheet" href="../../gitbook/gitbook-plugin-code/plugin.css">
                
            
                
                <link rel="stylesheet" href="../../gitbook/gitbook-plugin-anchor-navigation-ex/style/plugin.css">
                
            
                
                <link rel="stylesheet" href="../../gitbook/gitbook-plugin-fontsettings/website.css">
                
            
                
                <link rel="stylesheet" href="../../gitbook/gitbook-plugin-theme-fexa/fexa.css">
                
            
        

    

    
        
    
        
    
        
    
        
    
        
    
        
    

        
    
    
    <meta name="HandheldFriendly" content="true"/>
    <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
    <meta name="apple-mobile-web-app-capable" content="yes">
    <meta name="apple-mobile-web-app-status-bar-style" content="black">
    <link rel="apple-touch-icon-precomposed" sizes="152x152" href="../../gitbook/images/apple-touch-icon-precomposed-152.png">
    <link rel="shortcut icon" href="../../gitbook/images/favicon.ico" type="image/x-icon">

    
    <link rel="next" href="如何设计断线自动重连机制.html" />
    
    
    <link rel="prev" href="错误码系统的设计.html" />
    

    </head>
    <body>
        
<div class="book">
	<div class="header-inner">
		<!-- LOGO -->
		<div class="logo"></div>
		<span class="title"></span>

		<!-- Search -->
		
<div id="book-search-input" role="search">
    <input type="text" placeholder="Type to search" />
</div>


		<!-- Nav -->
		<ul class="header-nav">
			
		</ul>
	</div>

	<div class="book-summary">
		<div class="book-summary-title">文档目录</div>
		
		
		<nav role="navigation">
			


<ul class="summary">
    
    

    

    
        
        <li class="header">Part I</li>
        
        
    
        <li class="chapter " data-level="1.1" data-path="../../">
            
                <a href="../../">
            
                    
                    Introduction
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.2" data-path="../C++必知必会的知识点/">
            
                <a href="../C++必知必会的知识点/">
            
                    
                    C++必知必会的知识点
            
                </a>
            

            
            <ul class="articles">
                
    
        <li class="chapter " data-level="1.2.1" data-path="../C++必知必会的知识点/如何成为一名合格的CC++开发者？.html">
            
                <a href="../C++必知必会的知识点/如何成为一名合格的CC++开发者？.html">
            
                    
                    如何成为一名合格的C/C++开发者？
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.2.2" data-path="../C++必知必会的知识点/不定参数函数实现var_arg系列的宏.html">
            
                <a href="../C++必知必会的知识点/不定参数函数实现var_arg系列的宏.html">
            
                    
                    不定参数函数实现var_arg系列的宏
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.2.3" data-path="../C++必知必会的知识点/你一定要搞明白的C函数调用方式与栈原理.html">
            
                <a href="../C++必知必会的知识点/你一定要搞明白的C函数调用方式与栈原理.html">
            
                    
                    你一定要搞明白的C函数调用方式与栈原理
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.2.4" data-path="../C++必知必会的知识点/深入理解CC++中的指针.html">
            
                <a href="../C++必知必会的知识点/深入理解CC++中的指针.html">
            
                    
                    深入理解C/C++中的指针
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.2.5" data-path="../C++必知必会的知识点/详解C++11中的智能指针.html">
            
                <a href="../C++必知必会的知识点/详解C++11中的智能指针.html">
            
                    
                    详解C++11中的智能指针
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.2.6" data-path="../C++必知必会的知识点/C++17结构化绑定.html">
            
                <a href="../C++必知必会的知识点/C++17结构化绑定.html">
            
                    
                    C++17结构化绑定
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.2.7" data-path="../C++必知必会的知识点/C++必须掌握的pimpl惯用法.html">
            
                <a href="../C++必知必会的知识点/C++必须掌握的pimpl惯用法.html">
            
                    
                    C++必须掌握的pimpl惯用法
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.2.8" data-path="../C++必知必会的知识点/用VisualStudio调试Linux程序.html">
            
                <a href="../C++必知必会的知识点/用VisualStudio调试Linux程序.html">
            
                    
                    用Visual Studio调试Linux程序
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.2.9" data-path="../C++必知必会的知识点/如何使用VisualStudio管理和阅读开源项目代码.html">
            
                <a href="../C++必知必会的知识点/如何使用VisualStudio管理和阅读开源项目代码.html">
            
                    
                    如何使用Visual Studio管理和阅读开源项目代码
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.2.10" data-path="../C++必知必会的知识点/利用cmake工具生成VisualStudio工程文件.html">
            
                <a href="../C++必知必会的知识点/利用cmake工具生成VisualStudio工程文件.html">
            
                    
                    利用cmake工具生成Visual Studio工程文件
            
                </a>
            

            
        </li>
    

            </ul>
            
        </li>
    
        <li class="chapter " data-level="1.3" data-path="../多线程/">
            
                <a href="../多线程/">
            
                    
                    多线程
            
                </a>
            

            
            <ul class="articles">
                
    
        <li class="chapter " data-level="1.3.1" data-path="../多线程/后台C++开发你一定要知道的条件变量.html">
            
                <a href="../多线程/后台C++开发你一定要知道的条件变量.html">
            
                    
                    后台C++开发你一定要知道的条件变量
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.3.2" data-path="../多线程/整型变量赋值是原子操作吗？.html">
            
                <a href="../多线程/整型变量赋值是原子操作吗？.html">
            
                    
                    整型变量赋值是原子操作吗？
            
                </a>
            

            
        </li>
    

            </ul>
            
        </li>
    

    
        
        <li class="divider"></li>
        
        
    
        <li class="chapter " data-level="2.1" data-path="../网络编程/">
            
                <a href="../网络编程/">
            
                    
                    网络编程
            
                </a>
            

            
            <ul class="articles">
                
    
        <li class="chapter " data-level="2.1.1" data-path="../网络编程/bind函数重难点解析.html">
            
                <a href="../网络编程/bind函数重难点解析.html">
            
                    
                    bind 函数重难点解析
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="2.1.2" data-path="../网络编程/connect函数在阻塞和非阻塞模式下的行为.html">
            
                <a href="../网络编程/connect函数在阻塞和非阻塞模式下的行为.html">
            
                    
                    connect 函数在阻塞和非阻塞模式下的行为
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="2.1.3" data-path="../网络编程/select函数重难点解析.html">
            
                <a href="../网络编程/select函数重难点解析.html">
            
                    
                    select 函数重难点解析
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="2.1.4" data-path="../网络编程/Linuxepoll模型（含LT模式和ET模式详解）.html">
            
                <a href="../网络编程/Linuxepoll模型（含LT模式和ET模式详解）.html">
            
                    
                    Linux epoll 模型（含LT 模式和 ET 模式详解）
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="2.1.5" data-path="../网络编程/socket的阻塞模式和非阻塞模式.html">
            
                <a href="../网络编程/socket的阻塞模式和非阻塞模式.html">
            
                    
                    socket 的阻塞模式和非阻塞模式
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="2.1.6" data-path="../网络编程/非阻塞模式下send和recv函数的返回值.html">
            
                <a href="../网络编程/非阻塞模式下send和recv函数的返回值.html">
            
                    
                    非阻塞模式下 send 和 recv 函数的返回值
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="2.1.7" data-path="../网络编程/服务器开发通信协议设计介绍.html">
            
                <a href="../网络编程/服务器开发通信协议设计介绍.html">
            
                    
                    服务器开发通信协议设计介绍
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="2.1.8" data-path="../网络编程/TCP协议如何解决粘包、半包问题.html">
            
                <a href="../网络编程/TCP协议如何解决粘包、半包问题.html">
            
                    
                    TCP 协议如何解决粘包、半包问题
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="2.1.9" data-path="../网络编程/网络通信中收发数据的正确姿势.html">
            
                <a href="../网络编程/网络通信中收发数据的正确姿势.html">
            
                    
                    网络通信中收发数据的正确姿势
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="2.1.10" data-path="../网络编程/服务器端发数据时，如果对端一直不收，怎么办？.html">
            
                <a href="../网络编程/服务器端发数据时，如果对端一直不收，怎么办？.html">
            
                    
                    服务器端发数据时，如果对端一直不收，怎么办？
            
                </a>
            

            
        </li>
    

            </ul>
            
        </li>
    

    
        
        <li class="divider"></li>
        
        
    
        <li class="chapter " data-level="3.1" data-path="../程序员必知必会的网络命令/">
            
                <a href="../程序员必知必会的网络命令/">
            
                    
                    程序员必知必会的网络命令
            
                </a>
            

            
            <ul class="articles">
                
    
        <li class="chapter " data-level="3.1.1" data-path="../程序员必知必会的网络命令/利用telnet命令发电子邮件.html">
            
                <a href="../程序员必知必会的网络命令/利用telnet命令发电子邮件.html">
            
                    
                    利用telnet命令发电子邮件
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="3.1.2" data-path="../程序员必知必会的网络命令/做Java或者C++开发都应该知道的lsof命令.html">
            
                <a href="../程序员必知必会的网络命令/做Java或者C++开发都应该知道的lsof命令.html">
            
                    
                    做Java或者C++开发都应该知道的lsof命令
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="3.1.3" data-path="../程序员必知必会的网络命令/Linux网络故障排查的瑞士军刀.html">
            
                <a href="../程序员必知必会的网络命令/Linux网络故障排查的瑞士军刀.html">
            
                    
                    Linux网络故障排查的瑞士军刀nc命令
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="3.1.4" data-path="../程序员必知必会的网络命令/Linuxtcpdump使用介绍.html">
            
                <a href="../程序员必知必会的网络命令/Linuxtcpdump使用介绍.html">
            
                    
                    Linux tcpdump使用详解
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="3.1.5" data-path="../程序员必知必会的网络命令/从抓包的角度分析connect函数的连接过程.html">
            
                <a href="../程序员必知必会的网络命令/从抓包的角度分析connect函数的连接过程.html">
            
                    
                    从抓包的角度分析connect函数的连接过程
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="3.1.6" data-path="../程序员必知必会的网络命令/服务器开发中网络数据分析与故障排查经验漫谈.html">
            
                <a href="../程序员必知必会的网络命令/服务器开发中网络数据分析与故障排查经验漫谈.html">
            
                    
                    服务器开发中网络数据分析与故障排查经验漫谈
            
                </a>
            

            
        </li>
    

            </ul>
            
        </li>
    

    
        
        <li class="header">Part II</li>
        
        
    
        <li class="chapter " data-level="4.1" data-path="./">
            
                <a href="./">
            
                    
                    高性能服务器框架设计
            
                </a>
            

            
            <ul class="articles">
                
    
        <li class="chapter " data-level="4.1.1" data-path="主线程与工作线程的分工.html">
            
                <a href="主线程与工作线程的分工.html">
            
                    
                    主线程与工作线程的分工
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="4.1.2" data-path="Reactor模式.html">
            
                <a href="Reactor模式.html">
            
                    
                    Reactor模式
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="4.1.3" data-path="实例：一个服务器程序的架构介绍.html">
            
                <a href="实例：一个服务器程序的架构介绍.html">
            
                    
                    实例：一个服务器程序的架构介绍
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="4.1.4" data-path="错误码系统的设计.html">
            
                <a href="错误码系统的设计.html">
            
                    
                    错误码系统的设计
            
                </a>
            

            
        </li>
    
        <li class="chapter active" data-level="4.1.5" data-path="日志系统的设计.html">
            
                <a href="日志系统的设计.html">
            
                    
                    日志系统的设计
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="4.1.6" data-path="如何设计断线自动重连机制.html">
            
                <a href="如何设计断线自动重连机制.html">
            
                    
                    如何设计断线自动重连机制
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="4.1.7" data-path="心跳包机制设计详解.html">
            
                <a href="心跳包机制设计详解.html">
            
                    
                    心跳包机制设计详解
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="4.1.8" data-path="业务数据处理一定要单独开线程吗.html">
            
                <a href="业务数据处理一定要单独开线程吗.html">
            
                    
                    业务数据处理一定要单独开线程吗
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="4.1.9" data-path="C++高性能服务器网络框架设计细节.html">
            
                <a href="C++高性能服务器网络框架设计细节.html">
            
                    
                    C++ 高性能服务器网络框架设计细节
            
                </a>
            

            
        </li>
    

            </ul>
            
        </li>
    

    
        
        <li class="divider"></li>
        
        
    
        <li class="chapter " data-level="5.1" data-path="../服务器开发案例实战/">
            
                <a href="../服务器开发案例实战/">
            
                    
                    服务器开发案例实战
            
                </a>
            

            
            <ul class="articles">
                
    
        <li class="chapter " data-level="5.1.1" data-path="../服务器开发案例实战/从零实现一个http服务器.html">
            
                <a href="../服务器开发案例实战/从零实现一个http服务器.html">
            
                    
                    从零实现一个http服务器
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="5.1.2" data-path="../服务器开发案例实战/从零实现一款12306刷票软件.html">
            
                <a href="../服务器开发案例实战/从零实现一款12306刷票软件.html">
            
                    
                    从零实现一款12306刷票软件
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="5.1.3" data-path="../服务器开发案例实战/从零实现一个邮件收发客户端.html">
            
                <a href="../服务器开发案例实战/从零实现一个邮件收发客户端.html">
            
                    
                    从零实现一个邮件收发客户端
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="5.1.4" data-path="../服务器开发案例实战/从零开发一个WebSocket服务器.html">
            
                <a href="../服务器开发案例实战/从零开发一个WebSocket服务器.html">
            
                    
                    从零开发一个WebSocket服务器
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="5.1.5" data-path="../服务器开发案例实战/1从一款多人联机实时对战游戏开始.html">
            
                <a href="../服务器开发案例实战/1从一款多人联机实时对战游戏开始.html">
            
                    
                    从零学习开源项目系列（一） 从一款多人联机实时对战游戏开始
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="5.1.6" data-path="../服务器开发案例实战/2最后一战概况.html">
            
                <a href="../服务器开发案例实战/2最后一战概况.html">
            
                    
                    从零学习开源项目系列（二） 最后一战概况
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="5.1.7" data-path="../服务器开发案例实战/3CSBattleMgr服务源码研究.html">
            
                <a href="../服务器开发案例实战/3CSBattleMgr服务源码研究.html">
            
                    
                    从零学习开源项目系列（三） CSBattleMgr服务源码研究
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="5.1.8" data-path="../服务器开发案例实战/4LogServer源码探究.html">
            
                <a href="../服务器开发案例实战/4LogServer源码探究.html">
            
                    
                    从零学习开源项目系列（四）LogServer源码探究
            
                </a>
            

            
        </li>
    

            </ul>
            
        </li>
    

    
        
        <li class="header">Part III</li>
        
        
    
        <li class="chapter " data-level="6.1" data-path="../TeamTalk源码解析/">
            
                <a href="../TeamTalk源码解析/">
            
                    
                    TeamTalk IM源码分析
            
                </a>
            

            
            <ul class="articles">
                
    
        <li class="chapter " data-level="6.1.1" data-path="../TeamTalk源码解析/01TeamTalk介绍.html">
            
                <a href="../TeamTalk源码解析/01TeamTalk介绍.html">
            
                    
                    01 TeamTalk介绍
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="6.1.2" data-path="../TeamTalk源码解析/02服务器端的程序的编译与部署.html">
            
                <a href="../TeamTalk源码解析/02服务器端的程序的编译与部署.html">
            
                    
                    02 服务器端的程序的编译与部署
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="6.1.3" data-path="../TeamTalk源码解析/03服务器端的程序架构介绍.html">
            
                <a href="../TeamTalk源码解析/03服务器端的程序架构介绍.html">
            
                    
                    03 服务器端的程序架构介绍
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="6.1.4" data-path="../TeamTalk源码解析/04服务器端db_proxy_server源码分析.html">
            
                <a href="../TeamTalk源码解析/04服务器端db_proxy_server源码分析.html">
            
                    
                    04 服务器端db_proxy_server源码分析
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="6.1.5" data-path="../TeamTalk源码解析/05服务器端msg_server源码分析.html">
            
                <a href="../TeamTalk源码解析/05服务器端msg_server源码分析.html">
            
                    
                    05 服务器端msg_server源码分析
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="6.1.6" data-path="../TeamTalk源码解析/06服务器端login_server源码分析.html">
            
                <a href="../TeamTalk源码解析/06服务器端login_server源码分析.html">
            
                    
                    06 服务器端login_server源码分析
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="6.1.7" data-path="../TeamTalk源码解析/07服务器端msfs源码分析.html">
            
                <a href="../TeamTalk源码解析/07服务器端msfs源码分析.html">
            
                    
                    07 服务器端msfs源码分析
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="6.1.8" data-path="../TeamTalk源码解析/08服务器端file_server源码分析.html">
            
                <a href="../TeamTalk源码解析/08服务器端file_server源码分析.html">
            
                    
                    08 服务器端file_server源码分析
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="6.1.9" data-path="../TeamTalk源码解析/09服务器端route_server源码分析.html">
            
                <a href="../TeamTalk源码解析/09服务器端route_server源码分析.html">
            
                    
                    09 服务器端route_server源码分析
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="6.1.10" data-path="../TeamTalk源码解析/10开放一个TeamTalk测试服务器地址和几个测试账号.html">
            
                <a href="../TeamTalk源码解析/10开放一个TeamTalk测试服务器地址和几个测试账号.html">
            
                    
                    10 开放一个TeamTalk测试服务器地址和几个测试账号
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="6.1.11" data-path="../TeamTalk源码解析/11pc客户端源码分析.html">
            
                <a href="../TeamTalk源码解析/11pc客户端源码分析.html">
            
                    
                    11 pc客户端源码分析
            
                </a>
            

            
        </li>
    

            </ul>
            
        </li>
    

    
        
        <li class="divider"></li>
        
        
    
        <li class="chapter " data-level="7.1" data-path="../libevent源码深度剖析/">
            
                <a href="../libevent源码深度剖析/">
            
                    
                    libevent源码深度剖析
            
                </a>
            

            
            <ul class="articles">
                
    
        <li class="chapter " data-level="7.1.1" data-path="../libevent源码深度剖析/libevent源码深度剖析01.html">
            
                <a href="../libevent源码深度剖析/libevent源码深度剖析01.html">
            
                    
                    libevent源码深度剖析01
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="7.1.2" data-path="../libevent源码深度剖析/libevent源码深度剖析02.html">
            
                <a href="../libevent源码深度剖析/libevent源码深度剖析02.html">
            
                    
                    libevent源码深度剖析02
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="7.1.3" data-path="../libevent源码深度剖析/libevent源码深度剖析03.html">
            
                <a href="../libevent源码深度剖析/libevent源码深度剖析03.html">
            
                    
                    libevent源码深度剖析03
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="7.1.4" data-path="../libevent源码深度剖析/libevent源码深度剖析04.html">
            
                <a href="../libevent源码深度剖析/libevent源码深度剖析04.html">
            
                    
                    libevent源码深度剖析04
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="7.1.5" data-path="../libevent源码深度剖析/libevent源码深度剖析05.html">
            
                <a href="../libevent源码深度剖析/libevent源码深度剖析05.html">
            
                    
                    libevent源码深度剖析05
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="7.1.6" data-path="../libevent源码深度剖析/libevent源码深度剖析06.html">
            
                <a href="../libevent源码深度剖析/libevent源码深度剖析06.html">
            
                    
                    libevent源码深度剖析06
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="7.1.7" data-path="../libevent源码深度剖析/libevent源码深度剖析07.html">
            
                <a href="../libevent源码深度剖析/libevent源码深度剖析07.html">
            
                    
                    libevent源码深度剖析07
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="7.1.8" data-path="../libevent源码深度剖析/libevent源码深度剖析08.html">
            
                <a href="../libevent源码深度剖析/libevent源码深度剖析08.html">
            
                    
                    libevent源码深度剖析08
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="7.1.9" data-path="../libevent源码深度剖析/libevent源码深度剖析09.html">
            
                <a href="../libevent源码深度剖析/libevent源码深度剖析09.html">
            
                    
                    libevent源码深度剖析09
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="7.1.10" data-path="../libevent源码深度剖析/libevent源码深度剖析10.html">
            
                <a href="../libevent源码深度剖析/libevent源码深度剖析10.html">
            
                    
                    libevent源码深度剖析10
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="7.1.11" data-path="../libevent源码深度剖析/libevent源码深度剖析11.html">
            
                <a href="../libevent源码深度剖析/libevent源码深度剖析11.html">
            
                    
                    libevent源码深度剖析11
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="7.1.12" data-path="../libevent源码深度剖析/libevent源码深度剖析12.html">
            
                <a href="../libevent源码深度剖析/libevent源码深度剖析12.html">
            
                    
                    libevent源码深度剖析12
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="7.1.13" data-path="../libevent源码深度剖析/libevent源码深度剖析13.html">
            
                <a href="../libevent源码深度剖析/libevent源码深度剖析13.html">
            
                    
                    libevent源码深度剖析13
            
                </a>
            

            
        </li>
    

            </ul>
            
        </li>
    
        <li class="chapter " data-level="7.2" data-path="../leveldb源码分析/">
            
                <a href="../leveldb源码分析/">
            
                    
                    leveldb源码分析
            
                </a>
            

            
            <ul class="articles">
                
    
        <li class="chapter " data-level="7.2.1" data-path="../leveldb源码分析/leveldb源码分析1.html">
            
                <a href="../leveldb源码分析/leveldb源码分析1.html">
            
                    
                    leveldb源码分析1
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="7.2.2" data-path="../leveldb源码分析/leveldb源码分析2.html">
            
                <a href="../leveldb源码分析/leveldb源码分析2.html">
            
                    
                    leveldb源码分析2
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="7.2.3" data-path="../leveldb源码分析/leveldb源码分析3.html">
            
                <a href="../leveldb源码分析/leveldb源码分析3.html">
            
                    
                    leveldb源码分析3
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="7.2.4" data-path="../leveldb源码分析/leveldb源码分析4.html">
            
                <a href="../leveldb源码分析/leveldb源码分析4.html">
            
                    
                    leveldb源码分析4
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="7.2.5" data-path="../leveldb源码分析/leveldb源码分析5.html">
            
                <a href="../leveldb源码分析/leveldb源码分析5.html">
            
                    
                    leveldb源码分析5
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="7.2.6" data-path="../leveldb源码分析/leveldb源码分析6.html">
            
                <a href="../leveldb源码分析/leveldb源码分析6.html">
            
                    
                    leveldb源码分析6
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="7.2.7" data-path="../leveldb源码分析/leveldb源码分析7.html">
            
                <a href="../leveldb源码分析/leveldb源码分析7.html">
            
                    
                    leveldb源码分析7
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="7.2.8" data-path="../leveldb源码分析/leveldb源码分析8.html">
            
                <a href="../leveldb源码分析/leveldb源码分析8.html">
            
                    
                    leveldb源码分析8
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="7.2.9" data-path="../leveldb源码分析/leveldb源码分析9.html">
            
                <a href="../leveldb源码分析/leveldb源码分析9.html">
            
                    
                    leveldb源码分析9
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="7.2.10" data-path="../leveldb源码分析/leveldb源码分析10.html">
            
                <a href="../leveldb源码分析/leveldb源码分析10.html">
            
                    
                    leveldb源码分析10
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="7.2.11" data-path="../leveldb源码分析/leveldb源码分析11.html">
            
                <a href="../leveldb源码分析/leveldb源码分析11.html">
            
                    
                    leveldb源码分析11
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="7.2.12" data-path="../leveldb源码分析/leveldb源码分析12.html">
            
                <a href="../leveldb源码分析/leveldb源码分析12.html">
            
                    
                    leveldb源码分析12
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="7.2.13" data-path="../leveldb源码分析/leveldb源码分析13.html">
            
                <a href="../leveldb源码分析/leveldb源码分析13.html">
            
                    
                    leveldb源码分析13
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="7.2.14" data-path="../leveldb源码分析/leveldb源码分析14.html">
            
                <a href="../leveldb源码分析/leveldb源码分析14.html">
            
                    
                    leveldb源码分析14
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="7.2.15" data-path="../leveldb源码分析/leveldb源码分析15.html">
            
                <a href="../leveldb源码分析/leveldb源码分析15.html">
            
                    
                    leveldb源码分析15
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="7.2.16" data-path="../leveldb源码分析/leveldb源码分析16.html">
            
                <a href="../leveldb源码分析/leveldb源码分析16.html">
            
                    
                    leveldb源码分析16
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="7.2.17" data-path="../leveldb源码分析/leveldb源码分析17.html">
            
                <a href="../leveldb源码分析/leveldb源码分析17.html">
            
                    
                    leveldb源码分析17
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="7.2.18" data-path="../leveldb源码分析/leveldb源码分析18.html">
            
                <a href="../leveldb源码分析/leveldb源码分析18.html">
            
                    
                    leveldb源码分析18
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="7.2.19" data-path="../leveldb源码分析/leveldb源码分析19.html">
            
                <a href="../leveldb源码分析/leveldb源码分析19.html">
            
                    
                    leveldb源码分析19
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="7.2.20" data-path="../leveldb源码分析/leveldb源码分析20.html">
            
                <a href="../leveldb源码分析/leveldb源码分析20.html">
            
                    
                    leveldb源码分析20
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="7.2.21" data-path="../leveldb源码分析/leveldb源码分析21.html">
            
                <a href="../leveldb源码分析/leveldb源码分析21.html">
            
                    
                    leveldb源码分析21
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="7.2.22" data-path="../leveldb源码分析/leveldb源码分析22.html">
            
                <a href="../leveldb源码分析/leveldb源码分析22.html">
            
                    
                    leveldb源码分析22
            
                </a>
            

            
        </li>
    

            </ul>
            
        </li>
    

    
        
        <li class="divider"></li>
        
        
    
        <li class="chapter " data-level="8.1" data-path="../Memcached源码分析/">
            
                <a href="../Memcached源码分析/">
            
                    
                    Memcached源码分析
            
                </a>
            

            
            <ul class="articles">
                
    
        <li class="chapter " data-level="8.1.1" data-path="../Memcached源码分析/00服务器资源调整.html">
            
                <a href="../Memcached源码分析/00服务器资源调整.html">
            
                    
                    00 服务器资源调整
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="8.1.2" data-path="../Memcached源码分析/01初始化参数解析.html">
            
                <a href="../Memcached源码分析/01初始化参数解析.html">
            
                    
                    01 初始化参数解析
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="8.1.3" data-path="../Memcached源码分析/02网络监听的建立.html">
            
                <a href="../Memcached源码分析/02网络监听的建立.html">
            
                    
                    02 网络监听的建立
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="8.1.4" data-path="../Memcached源码分析/03网络连接建立.html">
            
                <a href="../Memcached源码分析/03网络连接建立.html">
            
                    
                    03 网络连接建立
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="8.1.5" data-path="../Memcached源码分析/04内存初始化.html">
            
                <a href="../Memcached源码分析/04内存初始化.html">
            
                    
                    04 内存初始化
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="8.1.6" data-path="../Memcached源码分析/05资源初始化.html">
            
                <a href="../Memcached源码分析/05资源初始化.html">
            
                    
                    05 资源初始化
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="8.1.7" data-path="../Memcached源码分析/06get过程.html">
            
                <a href="../Memcached源码分析/06get过程.html">
            
                    
                    06 get过程
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="8.1.8" data-path="../Memcached源码分析/07cas属性.html">
            
                <a href="../Memcached源码分析/07cas属性.html">
            
                    
                    07 cas属性
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="8.1.9" data-path="../Memcached源码分析/08内存池.html">
            
                <a href="../Memcached源码分析/08内存池.html">
            
                    
                    08 内存池
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="8.1.10" data-path="../Memcached源码分析/09连接队列.html">
            
                <a href="../Memcached源码分析/09连接队列.html">
            
                    
                    09 连接队列
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="8.1.11" data-path="../Memcached源码分析/10Hash表操作.html">
            
                <a href="../Memcached源码分析/10Hash表操作.html">
            
                    
                    10 Hash表操作
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="8.1.12" data-path="../Memcached源码分析/12set操作.html">
            
                <a href="../Memcached源码分析/12set操作.html">
            
                    
                    12 set操作
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="8.1.13" data-path="../Memcached源码分析/13do_item_alloc操作.html">
            
                <a href="../Memcached源码分析/13do_item_alloc操作.html">
            
                    
                    13 do_item_alloc操作
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="8.1.14" data-path="../Memcached源码分析/14item结构.html">
            
                <a href="../Memcached源码分析/14item结构.html">
            
                    
                    14 item结构
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="8.1.15" data-path="../Memcached源码分析/15Hash表扩容.html">
            
                <a href="../Memcached源码分析/15Hash表扩容.html">
            
                    
                    15 Hash表扩容
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="8.1.16" data-path="../Memcached源码分析/16线程交互.html">
            
                <a href="../Memcached源码分析/16线程交互.html">
            
                    
                    16 线程交互
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="8.1.17" data-path="../Memcached源码分析/17状态机.html">
            
                <a href="../Memcached源码分析/17状态机.html">
            
                    
                    17 状态机
            
                </a>
            

            
        </li>
    

            </ul>
            
        </li>
    

    
        
        <li class="divider"></li>
        
        
    
        <li class="chapter " data-level="9.1" data-path="../游戏开发专题/">
            
                <a href="../游戏开发专题/">
            
                    
                    游戏开发专题
            
                </a>
            

            
            <ul class="articles">
                
    
        <li class="chapter " data-level="9.1.1" data-path="../游戏开发专题/1游戏服务器开发的基本体系与服务器端开发的一些建议.html">
            
                <a href="../游戏开发专题/1游戏服务器开发的基本体系与服务器端开发的一些建议.html">
            
                    
                    1 游戏服务器开发的基本体系与服务器端开发的一些建议
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="9.1.2" data-path="../游戏开发专题/2网络游戏服务器开发框架设计介绍.html">
            
                <a href="../游戏开发专题/2网络游戏服务器开发框架设计介绍.html">
            
                    
                    2 网络游戏服务器开发框架设计介绍
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="9.1.3" data-path="../游戏开发专题/3游戏后端开发需要掌握的知识.html">
            
                <a href="../游戏开发专题/3游戏后端开发需要掌握的知识.html">
            
                    
                    3 游戏后端开发需要掌握的知识
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="9.1.4" data-path="../游戏开发专题/4关于游戏服务端架构的整理.html">
            
                <a href="../游戏开发专题/4关于游戏服务端架构的整理.html">
            
                    
                    4 关于游戏服务端架构的整理
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="9.1.5" data-path="../游戏开发专题/5各类游戏对应的服务端架构.html">
            
                <a href="../游戏开发专题/5各类游戏对应的服务端架构.html">
            
                    
                    5 各类游戏对应的服务端架构
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="9.1.6" data-path="../游戏开发专题/6从腾讯QQgame高性能服务器集群架构看“分而治之”与“自治”等分布式架构设计原则.html">
            
                <a href="../游戏开发专题/6从腾讯QQgame高性能服务器集群架构看“分而治之”与“自治”等分布式架构设计原则.html">
            
                    
                    6 从腾讯QQgame高性能服务器集群架构看“分而治之”与“自治”等分布式架构设计原则
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="9.1.7" data-path="../游戏开发专题/7QQ游戏百万人同时在线服务器架构实现.html">
            
                <a href="../游戏开发专题/7QQ游戏百万人同时在线服务器架构实现.html">
            
                    
                    7 QQ游戏百万人同时在线服务器架构实现
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="9.1.8" data-path="../游戏开发专题/8大型多人在线游戏服务器架构设计.html">
            
                <a href="../游戏开发专题/8大型多人在线游戏服务器架构设计.html">
            
                    
                    8 大型多人在线游戏服务器架构设计
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="9.1.9" data-path="../游戏开发专题/9百万用户级游戏服务器架构设计.html">
            
                <a href="../游戏开发专题/9百万用户级游戏服务器架构设计.html">
            
                    
                    9 百万用户级游戏服务器架构设计
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="9.1.10" data-path="../游戏开发专题/10十万在线的WebGame的数据库设计思路.html">
            
                <a href="../游戏开发专题/10十万在线的WebGame的数据库设计思路.html">
            
                    
                    10 十万在线的WebGame的数据库设计思路
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="9.1.11" data-path="../游戏开发专题/11一种高性能网络游戏服务器架构设计.html">
            
                <a href="../游戏开发专题/11一种高性能网络游戏服务器架构设计.html">
            
                    
                    11 一种高性能网络游戏服务器架构设计
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="9.1.12" data-path="../游戏开发专题/12经典游戏服务器端架构概述.html">
            
                <a href="../游戏开发专题/12经典游戏服务器端架构概述.html">
            
                    
                    12 经典游戏服务器端架构概述
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="9.1.13" data-path="../游戏开发专题/13游戏跨服架构进化之路.html">
            
                <a href="../游戏开发专题/13游戏跨服架构进化之路.html">
            
                    
                    13 游戏跨服架构进化之路
            
                </a>
            

            
        </li>
    

            </ul>
            
        </li>
    

    
        
        <li class="header">Part IV</li>
        
        
    
        <li class="chapter " data-level="10.1" data-path="../程序员面试题精讲/">
            
                <a href="../程序员面试题精讲/">
            
                    
                    程序员面试题精讲
            
                </a>
            

            
            <ul class="articles">
                
    
        <li class="chapter " data-level="10.1.1" data-path="../程序员面试题精讲/腾讯后台开发实习生技能要求.html">
            
                <a href="../程序员面试题精讲/腾讯后台开发实习生技能要求.html">
            
                    
                    腾讯后台开发实习生技能要求
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="10.1.2" data-path="../程序员面试题精讲/聊聊如何拿大厂的offer.html">
            
                <a href="../程序员面试题精讲/聊聊如何拿大厂的offer.html">
            
                    
                    聊聊如何拿大厂的 offer
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="10.1.3" data-path="../程序员面试题精讲/网络通信题目集锦.html">
            
                <a href="../程序员面试题精讲/网络通信题目集锦.html">
            
                    
                    网络通信题目集锦
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="10.1.4" data-path="../程序员面试题精讲/我面试后端开发经理的经历.html">
            
                <a href="../程序员面试题精讲/我面试后端开发经理的经历.html">
            
                    
                    我面试后端开发经理的经历
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="10.1.5" data-path="../程序员面试题精讲/LinuxCC++后端开发面试问哪些问题.html">
            
                <a href="../程序员面试题精讲/LinuxCC++后端开发面试问哪些问题.html">
            
                    
                    Linux C/C++后端开发面试问哪些问题
            
                </a>
            

            
        </li>
    

            </ul>
            
        </li>
    
        <li class="chapter " data-level="10.2" data-path="../职业规划/">
            
                <a href="../职业规划/">
            
                    
                    职业规划
            
                </a>
            

            
            <ul class="articles">
                
    
        <li class="chapter " data-level="10.2.1" data-path="../职业规划/给工作4年迷茫的程序员们的一点建议.html">
            
                <a href="../职业规划/给工作4年迷茫的程序员们的一点建议.html">
            
                    
                    给工作 4 年迷茫的程序员们的一点建议
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="10.2.2" data-path="../职业规划/聊聊技术人员的常见的职业问题.html">
            
                <a href="../职业规划/聊聊技术人员的常见的职业问题.html">
            
                    
                    聊聊技术人员的常见的职业问题
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="10.2.3" data-path="../职业规划/写给那些傻傻想做服务器开发的朋友.html">
            
                <a href="../职业规划/写给那些傻傻想做服务器开发的朋友.html">
            
                    
                    写给那些傻傻想做服务器开发的朋友
            
                </a>
            

            
        </li>
    

            </ul>
            
        </li>
    
        <li class="chapter " data-level="10.3" data-path="../自我提升与开源代码/">
            
                <a href="../自我提升与开源代码/">
            
                    
                    自我提升与开源代码
            
                </a>
            

            
            <ul class="articles">
                
    
        <li class="chapter " data-level="10.3.1" data-path="../自我提升与开源代码/2020年好好读一读开源代码吧.html">
            
                <a href="../自我提升与开源代码/2020年好好读一读开源代码吧.html">
            
                    
                    2020 年好好读一读开源代码吧
            
                </a>
            

            
        </li>
    

            </ul>
            
        </li>
    
        <li class="chapter " data-level="10.4" data-path="../后端开发相关的书籍/">
            
                <a href="../后端开发相关的书籍/">
            
                    
                    后端开发相关的书籍
            
                </a>
            

            
            <ul class="articles">
                
    
        <li class="chapter " data-level="10.4.1" data-path="../后端开发相关的书籍/后台开发应该读的书.html">
            
                <a href="../后端开发相关的书籍/后台开发应该读的书.html">
            
                    
                    后台开发应该读的书
            
                </a>
            

            
        </li>
    

            </ul>
            
        </li>
    
        <li class="chapter " data-level="10.5" data-path="../程序员的简历/">
            
                <a href="../程序员的简历/">
            
                    
                    程序员的简历
            
                </a>
            

            
            <ul class="articles">
                
    
        <li class="chapter " data-level="10.5.1" data-path="../程序员的简历/程序员如何写简历.html">
            
                <a href="../程序员的简历/程序员如何写简历.html">
            
                    
                    程序员如何写简历
            
                </a>
            

            
        </li>
    

            </ul>
            
        </li>
    
        <li class="chapter " data-level="10.6" data-path="../程序员的薪资与年终奖那些事儿/">
            
                <a href="../程序员的薪资与年终奖那些事儿/">
            
                    
                    程序员的薪资与年终奖那些事儿
            
                </a>
            

            
            <ul class="articles">
                
    
        <li class="chapter " data-level="10.6.1" data-path="../程序员的薪资与年终奖那些事儿/技术面试与HR谈薪资技巧.html">
            
                <a href="../程序员的薪资与年终奖那些事儿/技术面试与HR谈薪资技巧.html">
            
                    
                    技术面试与HR谈薪资技巧
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="10.6.2" data-path="../程序员的薪资与年终奖那些事儿/聊一聊程序员如何增加收入.html">
            
                <a href="../程序员的薪资与年终奖那些事儿/聊一聊程序员如何增加收入.html">
            
                    
                    聊一聊程序员如何增加收入
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="10.6.3" data-path="../程序员的薪资与年终奖那些事儿/谈一谈年终奖.html">
            
                <a href="../程序员的薪资与年终奖那些事儿/谈一谈年终奖.html">
            
                    
                    谈一谈年终奖
            
                </a>
            

            
        </li>
    

            </ul>
            
        </li>
    
        <li class="chapter " data-level="10.7" data-path="../程序员的烦心事/">
            
                <a href="../程序员的烦心事/">
            
                    
                    程序员的烦心事
            
                </a>
            

            
            <ul class="articles">
                
    
        <li class="chapter " data-level="10.7.1" data-path="../程序员的烦心事/拒绝了一家公司的offer后，他们的副总和hr总监同时打电话来询问拒绝原因并极力要求加入，我该不该去？.html">
            
                <a href="../程序员的烦心事/拒绝了一家公司的offer后，他们的副总和hr总监同时打电话来询问拒绝原因并极力要求加入，我该不该去？.html">
            
                    
                    拒绝了一家公司的offer后，他们的副总和hr总监同时打电话来询问拒绝原因并极力要求加入，我该不该去？
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="10.7.2" data-path="../程序员的烦心事/我是一名程序员，结婚时女友要求我用两年的工资作为彩礼，我该不该答应？.html">
            
                <a href="../程序员的烦心事/我是一名程序员，结婚时女友要求我用两年的工资作为彩礼，我该不该答应？.html">
            
                    
                    我是一名程序员，结婚时女友要求我用两年的工资作为彩礼，我该不该答应？
            
                </a>
            

            
        </li>
    

            </ul>
            
        </li>
    
        <li class="chapter " data-level="10.8" data-path="../作者的故事/">
            
                <a href="../作者的故事/">
            
                    
                    作者的故事
            
                </a>
            

            
            <ul class="articles">
                
    
        <li class="chapter " data-level="10.8.1" data-path="../作者的故事/我的2019.html">
            
                <a href="../作者的故事/我的2019.html">
            
                    
                    我的 2019
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="10.8.2" data-path="../作者的故事/我是如何年薪五十万的.html">
            
                <a href="../作者的故事/我是如何年薪五十万的.html">
            
                    
                    我是如何年薪五十万的
            
                </a>
            

            
        </li>
    

            </ul>
            
        </li>
    

    

    <li class="divider"></li>

    <li>
        <a href="https://www.gitbook.com" target="blank" class="gitbook-link">
            Published with GitBook
        </a>
    </li>
</ul>


		</nav>
		
		
	</div>

	<!-- Content nav -->
	<div class="book-anchor">
		<div class="book-anchor-title">在这篇文章中:</div>
		<div class="book-anchor-body">

		</div>
	</div>

	<div class="book-body">
		
		<div class="body-inner">
			
			

<div class="book-header" role="navigation">
    

    <!-- Title -->
    <h1>
        <i class="fa fa-circle-o-notch fa-spin"></i>
        <a href="../.." >日志系统的设计</a>
    </h1>
</div>




			<div class="page-wrapper" tabindex="-1" role="main">
				<div class="page-inner">
					
<div id="book-search-results">
    <div class="search-noresults">
    
					<section class="normal markdown-section">
						
						<div id="anchor-navigation-ex-navbar"><i class="fa fa-navicon"></i><ul><ul><li><span class="title-icon "></span><a href="#&#x65E5;&#x5FD7;&#x7CFB;&#x7EDF;&#x7684;&#x8BBE;&#x8BA1;"><b></b>&#x65E5;&#x5FD7;&#x7CFB;&#x7EDF;&#x7684;&#x8BBE;&#x8BA1;</a></li><ul><li><span class="title-icon "></span><a href="#&#x4E3A;&#x4EC0;&#x4E48;&#x9700;&#x8981;&#x65E5;&#x5FD7;"><b></b>&#x4E3A;&#x4EC0;&#x4E48;&#x9700;&#x8981;&#x65E5;&#x5FD7;</a></li><li><span class="title-icon "></span><a href="#&#x65E5;&#x5FD7;&#x7CFB;&#x7EDF;&#x7684;&#x6280;&#x672F;&#x4E0A;&#x7684;&#x5B9E;&#x73B0;"><b></b>&#x65E5;&#x5FD7;&#x7CFB;&#x7EDF;&#x7684;&#x6280;&#x672F;&#x4E0A;&#x7684;&#x5B9E;&#x73B0;</a></li></ul></ul></ul></div><h2 id="&#x65E5;&#x5FD7;&#x7CFB;&#x7EDF;&#x7684;&#x8BBE;&#x8BA1;"><a name="&#x65E5;&#x5FD7;&#x7CFB;&#x7EDF;&#x7684;&#x8BBE;&#x8BA1;" class="anchor-navigation-ex-anchor" href="#&#x65E5;&#x5FD7;&#x7CFB;&#x7EDF;&#x7684;&#x8BBE;&#x8BA1;"><i class="fa fa-link" aria-hidden="true"></i></a>&#x65E5;&#x5FD7;&#x7CFB;&#x7EDF;&#x7684;&#x8BBE;&#x8BA1;</h2>
<h3 id="&#x4E3A;&#x4EC0;&#x4E48;&#x9700;&#x8981;&#x65E5;&#x5FD7;"><a name="&#x4E3A;&#x4EC0;&#x4E48;&#x9700;&#x8981;&#x65E5;&#x5FD7;" class="anchor-navigation-ex-anchor" href="#&#x4E3A;&#x4EC0;&#x4E48;&#x9700;&#x8981;&#x65E5;&#x5FD7;"><i class="fa fa-link" aria-hidden="true"></i></a>&#x4E3A;&#x4EC0;&#x4E48;&#x9700;&#x8981;&#x65E5;&#x5FD7;</h3>
<p>&#x5B9E;&#x9645;&#x7684;&#x8F6F;&#x4EF6;&#x9879;&#x76EE;&#x4EA7;&#x51FA;&#x90FD;&#x6709;&#x4E00;&#x4E2A;&#x6D41;&#x7A0B;&#xFF0C;&#x5373;&#x5148;&#x5F00;&#x53D1;&#x3001;&#x6D4B;&#x8BD5;&#xFF0C;&#x518D;&#x53D1;&#x5E03;&#x751F;&#x4EA7;&#xFF0C;&#x7531;&#x4E8E;&#x4EBA;&#x7684;&#x56E0;&#x7D20;&#xFF0C;&#x65E2;&#x7136;&#x662F;&#x8F6F;&#x4EF6;&#x4EA7;&#x54C1;&#x5C31;&#x4E0D;&#x53EF;&#x80FD;&#x767E;&#x5206;&#x767E;&#x6CA1;&#x6709; bug &#x6216;&#x8005;&#x903B;&#x8F91;&#x9519;&#x8BEF;&#xFF0C;&#x5BF9;&#x4E8E;&#x5DF2;&#x7ECF;&#x53D1;&#x5E03;&#x5230;&#x751F;&#x4EA7;&#x7684;&#x9879;&#x76EE;&#xFF0C;&#x4E00;&#x65E6;&#x67D0;&#x4E2A;&#x65F6;&#x523B;&#x4EA7;&#x751F;&#x975E;&#x9884;&#x671F;&#x7684;&#x7ED3;&#x679C;&#xFF0C;&#x6211;&#x4EEC;&#x5C31;&#x9700;&#x8981;&#x53BB;&#x5B9A;&#x4F4D;&#x548C;&#x6392;&#x67E5;&#x95EE;&#x9898;&#x3002;&#x4F46;&#x662F;&#x4E00;&#x822C;&#x6B63;&#x5F0F;&#x7684;&#x751F;&#x4EA7;&#x73AF;&#x5883;&#x7684;&#x670D;&#x52A1;&#x5668;&#x6216;&#x8005;&#x4EA7;&#x54C1;&#x662F;&#x4E0D;&#x5141;&#x8BB8;&#x5F00;&#x53D1;&#x4EBA;&#x5458;&#x901A;&#x8FC7;&#x9644;&#x52A0;&#x8C03;&#x8BD5;&#x5668;&#x53BB;&#x6392;&#x67E5;&#x95EE;&#x9898;&#x7684;&#xFF0C;&#x4E3B;&#x8981;&#x6709;&#x5982;&#x4E0B;&#x53EF;&#x80FD;&#x539F;&#x56E0;&#xFF1A;</p>
<ol>
<li>&#x5728;&#x5F88;&#x591A;&#x4E92;&#x8054;&#x7F51;&#x4F01;&#x4E1A;&#xFF0C;&#x5F00;&#x53D1;&#x90E8;&#x95E8;&#x3001;&#x6D4B;&#x8BD5;&#x90E8;&#x5206;&#x548C;&#x4EA7;&#x54C1;&#x8FD0;&#x7EF4;&#x90E8;&#x95E8;&#x662F;&#x5206;&#x5DE5;&#x660E;&#x786E;&#x7684;&#xFF0C;&#x8F6F;&#x4EF6;&#x4EA7;&#x54C1;&#x4E00;&#x65E6;&#x53D1;&#x5E03;&#x5230;&#x751F;&#x4EA7;&#x73AF;&#x5883;&#x4EE5;&#x540E;&#xFF0C;&#x5C06;&#x5168;&#x90E8;&#x4EA4;&#x7531;&#x8FD0;&#x7EF4;&#x90E8;&#x95E8;&#x4EBA;&#x5458;&#x53BB;&#x7BA1;&#x7406;&#x548C;&#x7EF4;&#x62A4;&#xFF0C;&#x800C;&#x539F;&#x6765;&#x5F00;&#x53D1;&#x6B64;&#x4EA7;&#x54C1;&#x7684;&#x5F00;&#x53D1;&#x4EBA;&#x5458;&#x4E0D;&#x518D;&#x62E5;&#x6709;&#x76F8;&#x5173;&#x7684;&#x64CD;&#x4F5C;&#x7A0B;&#x5E8F;&#x7684;&#x6743;&#x9650;&#x3002;</li>
<li>&#x5BF9;&#x4E8E;&#x5DF2;&#x7ECF;&#x4E0A;&#x4E86;&#x751F;&#x4EA7;&#x73AF;&#x5883;&#x7684;&#x670D;&#x52A1;&#xFF0C;&#x5176;&#x6570;&#x636E;&#x548C;&#x7A0B;&#x5E8F;&#x7A33;&#x5B9A;&#x6027;&#x662F;&#x516C;&#x53F8;&#x7684;&#x6838;&#x5FC3;&#x4EA7;&#x503C;&#x6240;&#x5728;&#xFF0C;&#x4E00;&#x822C;&#x4E0D;&#x6562;&#x6216;&#x4E0D;&#x5141;&#x8BB8;&#x88AB;&#x5F00;&#x53D1;&#x4EBA;&#x5458;&#x968F;&#x610F;&#x8C03;&#x8BD5;&#x6216;&#x8005;&#x64CD;&#x4F5C;&#xFF0C;&#x4EE5;&#x514D;&#x9020;&#x6210;&#x635F;&#x5931;&#x3002;</li>
<li>&#x53D1;&#x5E03;&#x5230;&#x751F;&#x4EA7;&#x73AF;&#x5883;&#x7684;&#x670D;&#x52A1;&#xFF0C;&#x4E00;&#x822C;&#x4E3A;&#x4E86;&#x8BA9;&#x7A0B;&#x5E8F;&#x6267;&#x884C;&#x6548;&#x7387;&#x66F4;&#x9AD8;&#x3001;&#x6587;&#x4EF6;&#x4F53;&#x79EF;&#x66F4;&#x5C0F;&#xFF0C;&#x90FD;&#x662F;&#x53BB;&#x6389;&#x8C03;&#x8BD5;&#x7B26;&#x53F7;&#x540E;&#x7684;&#x7248;&#x672C;&#xFF0C;&#x4E0D;&#x65B9;&#x4FBF;&#x4E5F;&#x4E0D;&#x5229;&#x4E8E;&#x8C03;&#x8BD5;&#x3002;</li>
</ol>
<p>&#x65E2;&#x7136;&#x6211;&#x4EEC;&#x65E0;&#x6CD5;&#x901A;&#x8FC7;&#x8C03;&#x8BD5;&#x5668;&#x53BB;&#x8C03;&#x8BD5;&#xFF0C;&#x8FD9;&#x4E2A;&#x65F6;&#x5019;&#x4E3A;&#x4E86;&#x8DDF;&#x8E2A;&#x548C;&#x56DE;&#x5FC6;&#x5F53;&#x65F6;&#x7684;&#x7A0B;&#x5E8F;&#x884C;&#x4E3A;&#x8FDB;&#x800C;&#x5B9A;&#x4F4D;&#x95EE;&#x9898;&#xFF0C;&#x6211;&#x4EEC;&#x5C31;&#x9700;&#x8981;&#x65E5;&#x5FD7;&#x7CFB;&#x7EDF;&#x3002;</p>
<p>&#x9000;&#x4E00;&#x6B65;&#x8BF4;&#xFF0C;&#x5373;&#x4F7F;&#x5728;&#x5F00;&#x53D1;&#x6216;&#x8005;&#x6D4B;&#x8BD5;&#x73AF;&#x5883;&#xFF0C;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x628A;&#x7A0B;&#x5E8F;&#x9644;&#x52A0;&#x5230;&#x8C03;&#x8BD5;&#x5668;&#x4E0A;&#x53BB;&#x8C03;&#x8BD5;&#xFF0C;&#x4F46;&#x662F;&#x5BF9;&#x4E8E;&#x4E00;&#x4E9B;&#x7279;&#x5B9A;&#x7684;&#x7A0B;&#x5E8F;&#x884C;&#x4E3A;&#xFF0C;&#x6211;&#x4EEC;&#x65E0;&#x6CD5;&#x901A;&#x8FC7;&#x8BBE;&#x7F6E;&#x65AD;&#x70B9;&#xFF0C;&#x8BA9;&#x7A0B;&#x5E8F;&#x5728;&#x67D0;&#x4E2A;&#x65F6;&#x523B;&#x6682;&#x505C;&#x4E0B;&#x6765;&#x8FDB;&#x884C;&#x8C03;&#x8BD5;&#x3002;&#x4F8B;&#x5982;&#xFF0C;&#x5BF9;&#x4E8E;&#x67D0;&#x4E9B;&#x7F51;&#x7EDC;&#x901A;&#x4FE1;&#x529F;&#x80FD;&#xFF0C;&#x5982;&#x679C;&#x6682;&#x505C;&#x65F6;&#x95F4;&#x8FC7;&#x957F;&#xFF08;&#x76F8;&#x5BF9;&#x4E8E;&#x67D0;&#x4E9B;&#x7A0B;&#x5E8F;&#x903B;&#x8F91;&#x6765;&#x8BF4;&#xFF09;&#xFF0C;&#x901A;&#x4FE1;&#x7684;&#x5BF9;&#x7AEF;&#x53EF;&#x80FD;&#x7531;&#x4E8E;&#x5F7C;&#x7AEF;&#x6CA1;&#x6709;&#x5728;&#x89C4;&#x5B9A;&#x65F6;&#x95F4;&#x5185;&#x54CD;&#x5E94;&#x800C;&#x65AD;&#x5F00;&#x8FDE;&#x63A5;&#xFF0C;&#x5BFC;&#x81F4;&#x7A0B;&#x5E8F;&#x903B;&#x8F91;&#x65E0;&#x6CD5;&#x8FDB;&#x5165;&#x6211;&#x4EEC;&#x60F3;&#x8981;&#x7684;&#x6267;&#x884C;&#x6D41;&#x4E2D;&#x53BB;&#xFF1B;&#x518D;&#x4F8B;&#x5982;&#xFF0C;&#x5BF9;&#x4E8E;&#x4E00;&#x4E9B;&#x9AD8;&#x9891;&#x64CD;&#x4F5C;&#xFF08;&#x5982;&#x5FC3;&#x8DF3;&#x5305;&#x3001;&#x5B9A;&#x65F6;&#x5668;&#x3001;&#x754C;&#x9762;&#x7ED8;&#x5236;&#x4E0B;&#x7684;&#x67D0;&#x4E9B;&#x9AD8;&#x9891;&#x91CD;&#x590D;&#x884C;&#x4E3A;&#xFF09;&#xFF0C;&#x53EF;&#x80FD;&#x5728;&#x5C11;&#x91CF;&#x6B21;&#x6570;&#x4E0B;&#x65E0;&#x6CD5;&#x89E6;&#x53D1;&#x6211;&#x4EEC;&#x60F3;&#x8981;&#x7684;&#x884C;&#x4E3A;&#xFF0C;&#x800C;&#x901A;&#x8FC7;&#x65AD;&#x70B9;&#x7684;&#x6682;&#x505C;&#x65B9;&#x5F0F;&#xFF0C;&#x6211;&#x4EEC;&#x4E0D;&#x5F97;&#x4E0D;&#x91CD;&#x590D;&#x64CD;&#x4F5C;&#x51E0;&#x5341;&#x6B21;&#x3001;&#x4E0A;&#x767E;&#x6B21;&#x751A;&#x81F3;&#x66F4;&#x591A;&#xFF0C;&#x8FD9;&#x6837;&#x6392;&#x67E5;&#x95EE;&#x9898;&#x6548;&#x7387;&#x662F;&#x975E;&#x5E38;&#x4F4E;&#x4E0B;&#x7684;&#x3002;&#x5BF9;&#x4E8E;&#x8FD9;&#x7C7B;&#x64CD;&#x4F5C;&#xFF0C;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x6253;&#x5370;&#x65E5;&#x5FD7;&#xFF0C;&#x5C06;&#x5F53;&#x65F6;&#x7684;&#x7A0B;&#x5E8F;&#x884C;&#x4E3A;&#x4E0A;&#x4E0B;&#x6587;&#x73B0;&#x573A;&#x8BB0;&#x5F55;&#x4E0B;&#x6765;&#xFF0C;&#x7136;&#x540E;&#x4ECE;&#x65E5;&#x5FD7;&#x7CFB;&#x7EDF;&#x4E2D;&#x627E;&#x5230;&#x67D0;&#x6B21;&#x4E0D;&#x6B63;&#x5E38;&#x7684;&#x884C;&#x4E3A;&#x7684;&#x4E0A;&#x4E0B;&#x6587;&#x4FE1;&#x606F;&#x3002;&#x8FD9;&#x4E5F;&#x662F;&#x65E5;&#x5FD7;&#x7684;&#x53E6;&#x5916;&#x4E00;&#x4E2A;&#x4F5C;&#x7528;&#x3002;</p>
<p>&#x672C;&#x6587;&#x5C06;&#x4ECE;&#x6280;&#x672F;&#x548C;&#x4E1A;&#x52A1;&#x4E0A;&#x4E24;&#x4E2A;&#x65B9;&#x9762;&#x6765;&#x4ECB;&#x7ECD;&#x65E5;&#x5FD7;&#x7CFB;&#x7EDF;&#x76F8;&#x5173;&#x7684;&#x8BBE;&#x8BA1;&#x4E0E;&#x5F00;&#x53D1;&#xFF0C;&#x6240;&#x8C13;&#x6280;&#x672F;&#x4E0A;&#xFF0C;&#x5C31;&#x662F;&#x5982;&#x4F55;&#x4ECE;&#x7A0B;&#x5E8F;&#x5F00;&#x53D1;&#x7684;&#x89D2;&#x5EA6;&#x8BBE;&#x8BA1;&#x4E00;&#x6B3E;&#x529F;&#x80FD;&#x5F3A;&#x5927;&#x3001;&#x6027;&#x80FD;&#x4F18;&#x8D8A;&#x3001;&#x4F7F;&#x7528;&#x65B9;&#x4FBF;&#x7684;&#x65E5;&#x5FD7;&#x7CFB;&#x7EDF;&#xFF1B;&#x800C;&#x4E1A;&#x52A1;&#x4E0A;&#xFF0C;&#x662F;&#x6307;&#x6211;&#x4EEC;&#x5728;&#x4F7F;&#x7528;&#x65E5;&#x5FD7;&#x7CFB;&#x7EDF;&#x65F6;&#xFF0C;&#x5E94;&#x8BE5;&#x53BB;&#x8BB0;&#x5F55;&#x54EA;&#x4E9B;&#x884C;&#x4E3A;&#x548C;&#x6570;&#x636E;&#xFF0C;&#x65E2;&#x7B80;&#x6D01;&#x3001;&#x4E0D;&#x5570;&#x55E6;&#xFF0C;&#x53C8;&#x65B9;&#x4FBF;&#x9700;&#x8981;&#x65F6;&#x5FEB;&#x901F;&#x51C6;&#x786E;&#x5730;&#x5B9A;&#x4F4D;&#x5230;&#x95EE;&#x9898;&#x3002;</p>
<h3 id="&#x65E5;&#x5FD7;&#x7CFB;&#x7EDF;&#x7684;&#x6280;&#x672F;&#x4E0A;&#x7684;&#x5B9E;&#x73B0;"><a name="&#x65E5;&#x5FD7;&#x7CFB;&#x7EDF;&#x7684;&#x6280;&#x672F;&#x4E0A;&#x7684;&#x5B9E;&#x73B0;" class="anchor-navigation-ex-anchor" href="#&#x65E5;&#x5FD7;&#x7CFB;&#x7EDF;&#x7684;&#x6280;&#x672F;&#x4E0A;&#x7684;&#x5B9E;&#x73B0;"><i class="fa fa-link" aria-hidden="true"></i></a>&#x65E5;&#x5FD7;&#x7CFB;&#x7EDF;&#x7684;&#x6280;&#x672F;&#x4E0A;&#x7684;&#x5B9E;&#x73B0;</h3>
<p>&#x65E5;&#x5FD7;&#x7684;&#x6700;&#x521D;&#x7684;&#x539F;&#x578B;&#x5373;&#x5C06;&#x7A0B;&#x5E8F;&#x8FD0;&#x884C;&#x7684;&#x72B6;&#x6001;&#x6253;&#x5370;&#x51FA;&#x6765;&#xFF0C;&#x5BF9;&#x4E8E; C/C++ &#x8FD9;&#x95E8;&#x8BED;&#x8A00;&#x6765;&#x8BF4;&#xFF0C;&#x5373;&#x53EF;&#x4EE5;&#x5229;&#x7528; <strong>printf</strong>&#x3001;<strong>std::cout</strong> &#x7B49;&#x63A7;&#x5236;&#x53F0;&#x8F93;&#x51FA;&#x51FD;&#x6570;&#xFF0C;&#x5C06;&#x65E5;&#x5FD7;&#x4FE1;&#x606F;&#x8F93;&#x51FA;&#x5230;&#x63A7;&#x5236;&#x53F0;&#xFF0C;&#x8FD9;&#x7C7B;&#x7B80;&#x5355;&#x7684;&#x60C5;&#x5F62;&#x6211;&#x4EEC;&#x4E0D;&#x5728;&#x6B64;&#x8FC7;&#x591A;&#x8D58;&#x8FF0;&#x3002;</p>
<p>&#x5BF9;&#x4E8E;&#x5546;&#x4E1A;&#x9879;&#x76EE;&#xFF0C;&#x4E3A;&#x4E86;&#x65B9;&#x4FBF;&#x6392;&#x67E5;&#x95EE;&#x9898;&#xFF0C;&#x6211;&#x4EEC;&#x4E00;&#x822C;&#x4E0D;&#x5C06;&#x65E5;&#x5FD7;&#x5199;&#x5230;&#x63A7;&#x5236;&#x53F0;&#xFF0C;&#x800C;&#x662F;&#x8F93;&#x51FA;&#x5230;&#x6587;&#x4EF6;&#x6216;&#x8005;&#x6570;&#x636E;&#x5E93;&#x7CFB;&#x7EDF;&#x3002;&#x4E0D;&#x7BA1;&#x54EA;&#x4E00;&#x79CD;&#xFF0C;&#x5176;&#x601D;&#x8DEF;&#x57FA;&#x672C;&#x4E0A;&#x4E00;&#x81F4;&#xFF0C;&#x6211;&#x4EEC;&#x8FD9;&#x91CC;&#x4EE5;&#x5199;&#x6587;&#x4EF6;&#x4E3A;&#x4F8B;&#x6765;&#x8BE6;&#x7EC6;&#x4ECB;&#x7ECD;&#x3002;</p>
<h4 id="&#x540C;&#x6B65;&#x5199;&#x65E5;&#x5FD7;"><a name="&#x540C;&#x6B65;&#x5199;&#x65E5;&#x5FD7;" class="anchor-navigation-ex-anchor" href="#&#x540C;&#x6B65;&#x5199;&#x65E5;&#x5FD7;"><i class="fa fa-link" aria-hidden="true"></i></a>&#x540C;&#x6B65;&#x5199;&#x65E5;&#x5FD7;</h4>
<p>&#x6240;&#x8C13;&#x540C;&#x6B65;&#x5199;&#x65E5;&#x5FD7;&#xFF0C;&#x6307;&#x7684;&#x662F;&#x5728;&#x8F93;&#x51FA;&#x65E5;&#x5FD7;&#x7684;&#x5730;&#x65B9;&#xFF0C;&#x5C06;&#x65E5;&#x5FD7;&#x5373;&#x65F6;&#x5199;&#x5165;&#x5230;&#x6587;&#x4EF6;&#x4E2D;&#x53BB;&#x3002;&#x6839;&#x636E;&#x7B14;&#x8005;&#x7684;&#x7ECF;&#x9A8C;&#xFF0C;&#x8FD9;&#x79CD;&#x8BBE;&#x8BA1;&#x5E7F;&#x6CDB;&#x5730;&#x7528;&#x4E8E;&#x76F8;&#x5F53;&#x591A;&#x7684;&#x7684;&#x5BA2;&#x6237;&#x7AEF;&#x8F6F;&#x4EF6;&#x3002;&#x7B14;&#x8005;&#x66FE;&#x4ECE;&#x4E8B;&#x8FC7;&#x6570;&#x5E74;&#x7684;&#x5BA2;&#x6237;&#x7AEF;&#x5F00;&#x53D1;&#xFF08;&#x5305;&#x62EC; PC&#x3001;&#x5B89;&#x5353;&#x8F6F;&#x4EF6;&#xFF09;&#xFF0C;&#x8BBE;&#x8BA1;&#x8FC7;&#x4E00;&#x4E9B;&#x529F;&#x80FD;&#x590D;&#x6742;&#x7684;&#x91D1;&#x878D;&#x5BA2;&#x6237;&#x7AEF;&#x4EA7;&#x54C1;&#xFF0C;&#x5728;&#x8FD9;&#x4E9B;&#x7CFB;&#x7EDF;&#x4E2D;&#x91C7;&#x7528;&#x7684;&#x5C31;&#x662F;&#x8FD9;&#x79CD;&#x540C;&#x6B65;&#x5199;&#x65E5;&#x5FD7;&#x7684;&#x65B9;&#x5F0F;&#x3002;&#x4E4B;&#x6240;&#x4EE5;&#x4F7F;&#x7528;&#x8FD9;&#x79CD;&#x65B9;&#x5F0F;&#x5176;&#x4E3B;&#x8981;&#x539F;&#x56E0;&#x5C31;&#x662F;&#x8BBE;&#x8BA1;&#x7B80;&#x5355;&#xFF0C;&#x800C;&#x53C8;&#x4E0D;&#x4F1A;&#x5F71;&#x54CD;&#x7528;&#x6237;&#x4F7F;&#x7528;&#x4F53;&#x9A8C;&#x3002;&#x8BF4;&#x5230;&#x8FD9;&#x91CC;&#x8BFB;&#x8005;&#x53EF;&#x80FD;&#x6709;&#x8FD9;&#x6837;&#x4E00;&#x4E2A;&#x7591;&#x95EE;&#xFF1A;&#x4E00;&#x822C;&#x7684;&#x5BA2;&#x6237;&#x7AEF;&#x8F6F;&#x4EF6;&#xFF0C;&#x4E00;&#x822C;&#x5B58;&#x5728;&#x754C;&#x9762;&#xFF0C;&#x800C;&#x754C;&#x9762;&#x90E8;&#x5206;&#x6240;&#x5C5E;&#x7684;&#x903B;&#x8F91;&#x5C31;&#x662F;&#x7A0B;&#x5E8F;&#x7684;&#x4E3B;&#x7EBF;&#x7A0B;&#xFF0C;&#x5982;&#x679C;&#x91C7;&#x53D6;&#x8FD9;&#x79CD;&#x540C;&#x6B65;&#x5199;&#x65E5;&#x5FD7;&#x7684;&#x65B9;&#x5F0F;&#xFF0C;&#x5F53;&#x5199;&#x65E5;&#x5FD7;&#x65F6;&#xFF0C;&#x5199;&#x6587;&#x4EF6;&#x662F;&#x78C1;&#x76D8; IO &#x64CD;&#x4F5C;&#xFF0C;&#x76F8;&#x6BD4;&#x8F83;&#x7A0B;&#x5E8F;&#x5176;&#x4ED6;&#x90E8;&#x5206;&#x662F; CPU &#x64CD;&#x4F5C;&#xFF0C;&#x524D;&#x8005;&#x8981;&#x6162;&#x5F88;&#x591A;&#xFF0C;&#x8FD9;&#x6837;&#x52BF;&#x5FC5;&#x9020;&#x6210;CPU&#x7B49;&#x5F85;&#xFF0C;&#x8FDB;&#x800C;&#x5BFC;&#x81F4;&#x4E3B;&#x7EBF;&#x7A0B;&#x201C;&#x5361;&#x201D;&#x5728;&#x5199;&#x6587;&#x4EF6;&#x5904;&#xFF0C;&#x8FDB;&#x800C;&#x9020;&#x6210;&#x754C;&#x9762;&#x5361;&#x987F;&#xFF0C;&#x4ECE;&#x800C;&#x5BFC;&#x81F4;&#x7528;&#x6237;&#x4F7F;&#x7528;&#x8F6F;&#x4EF6;&#x7684;&#x4F53;&#x9A8C;&#x4E0D;&#x597D;&#x3002;&#x8BFB;&#x8005;&#x7684;&#x8FD9;&#x79CD;&#x987E;&#x8651;&#x786E;&#x5B9E;&#x662F;&#x5B58;&#x5728;&#x7684;&#x3002;&#x4F46;&#x662F;&#xFF0C;&#x5F88;&#x591A;&#x65F6;&#x5019;&#x6211;&#x4EEC;&#x4E0D;&#x7528;&#x62C5;&#x5FC3;&#x8FD9;&#x79CD;&#x95EE;&#x9898;&#xFF0C;&#x4E3B;&#x8981;&#x6709;&#x4E24;&#x4E2A;&#x539F;&#x56E0;&#xFF1A;</p>
<ol>
<li>&#x5BF9;&#x4E8E;&#x5BA2;&#x6237;&#x7AEF;&#x7A0B;&#x5E8F;&#xFF0C;&#x5373;&#x4F7F;&#x5728;&#x4E3B;&#x7EBF;&#x7A0B;&#xFF08;UI &#x7EBF;&#x7A0B;&#xFF09;&#x4E2D;&#x540C;&#x6B65;&#x5199;&#x6587;&#x4EF6;&#xFF0C;&#x5176;&#x5355;&#x6B21;&#x6216;&#x8005;&#x51E0;&#x6B21;&#x78C1;&#x76D8;&#x64CD;&#x4F5C;&#x7D2F;&#x52A0;&#x65F6;&#x95F4;&#xFF0C;&#x4E0E;&#x4EBA;&#xFF08;&#x7528;&#x6237;&#xFF09;&#x7684;&#x53EF;&#x611F;&#x77E5;&#x65F6;&#x95F4;&#x76F8;&#x6BD4;&#xFF0C;&#x4E5F;&#x662F;&#x975E;&#x5E38;&#x5C0F;&#x7684;&#xFF0C;&#x4E5F;&#x5C31;&#x662F;&#x8BF4;&#x7528;&#x6237;&#x6839;&#x672C;&#x611F;&#x89C9;&#x4E0D;&#x5230;&#x8FD9;&#x79CD;&#x540C;&#x6B65;&#x5199;&#x6587;&#x4EF6;&#x9020;&#x6210;&#x7684;&#x5EF6;&#x8FDF;&#x3002;&#x5F53;&#x7136;&#xFF0C;&#x8FD9;&#x91CC;&#x4E5F;&#x7ED9;&#x60A8;&#x4E00;&#x4E2A;&#x63D0;&#x9192;&#x5C31;&#x662F;&#xFF0C;&#x5982;&#x679C;&#x5728; UI &#x7EBF;&#x7A0B;&#x91CC;&#x9762;&#x5199;&#x65E5;&#x5FD7;&#xFF0C;&#x5C24;&#x5176;&#x662F;&#x5728;&#x4E00;&#x4E9B;&#x9AD8;&#x9891;&#x64CD;&#x4F5C;&#x4E2D;&#xFF08;&#x5982; Windows &#x7684;&#x754C;&#x9762;&#x7ED8;&#x5236;&#x6D88;&#x606F; WM_PAINT &#x5904;&#x7406;&#x903B;&#x8F91;&#x4E2D;&#xFF09;&#xFF0C;&#x4E00;&#x5B9A;&#x8981;&#x63A7;&#x5236;&#x5199;&#x65E5;&#x5FD7;&#x7684;&#x957F;&#x5EA6;&#x548C;&#x6B21;&#x6570;&#xFF0C;&#x5426;&#x5219;&#x5C31;&#x4F1A;&#x56E0;&#x9891;&#x7E41;&#x5199;&#x6587;&#x4EF6;&#x6216;&#x4E00;&#x6B21;&#x5199;&#x5165;&#x6570;&#x636E;&#x8FC7;&#x5927;&#x800C;&#x5BF9;&#x754C;&#x9762;&#x9020;&#x6210;&#x5361;&#x987F;&#x3002;</li>
<li>&#x5BA2;&#x6237;&#x7AEF;&#x7A0B;&#x5E8F;&#x9664;&#x4E86; UI &#x7EBF;&#x7A0B;&#xFF0C;&#x8FD8;&#x6709;&#x5176;&#x4ED6;&#x4E0E;&#x754C;&#x9762;&#x65E0;&#x5173;&#x7684;&#x5DE5;&#x4F5C;&#x7EBF;&#x7A0B;&#xFF0C;&#x5728;&#x8FD9;&#x4E9B;&#x7EBF;&#x7A0B;&#x4E2D;&#x76F4;&#x63A5;&#x5199;&#x6587;&#x4EF6;&#xFF0C;&#x4E00;&#x822C;&#x4E0D;&#x4F1A;&#x5BF9;&#x7528;&#x6237;&#x7684;&#x4F53;&#x9A8C;&#x4EA7;&#x751F;&#x4EC0;&#x4E48;&#x5F71;&#x54CD;&#x3002;</li>
</ol>
<p>&#x8BF4;&#x4E86;&#x8FD9;&#x4E48;&#x591A;&#xFF0C;&#x6211;&#x4EEC;&#x7ED9;&#x51FA;&#x4E00;&#x4E2A;&#x5177;&#x4F53;&#x7684;&#x4F8B;&#x5B50;&#x3002;</p>
<p><strong>&#x65E5;&#x5FD7;&#x7C7B;&#x7684; .h &#x6587;&#x4EF6;</strong></p>
<pre class="language-"><code>/**
 *@desc:   IULog.h
 *@author: zhangyl
 *@date:   2014.12.25
 */
#ifndef __LOG_H__
#define __LOG_H__

enum LOG_LEVEL
{
    LOG_LEVEL_INFO,
    LOG_LEVEL_WARNING,
    LOG_LEVEL_ERROR
};

//&#x6CE8;&#x610F;&#xFF1A;&#x5982;&#x679C;&#x6253;&#x5370;&#x7684;&#x65E5;&#x5FD7;&#x4FE1;&#x606F;&#x4E2D;&#x6709;&#x4E2D;&#x6587;&#xFF0C;&#x5219;&#x683C;&#x5F0F;&#x5316;&#x5B57;&#x7B26;&#x4E32;&#x8981;&#x7528;_T()&#x5B8F;&#x5305;&#x88F9;&#x8D77;&#x6765;&#xFF0C;
#define LOG_INFO(...)     CIULog::Log(LOG_LEVEL_INFO, __FUNCSIG__,__LINE__, __VA_ARGS__)
#define LOG_WARNING(...)  CIULog::Log(LOG_LEVEL_WARNING, __FUNCSIG__, __LINE__,__VA_ARGS__)
#define LOG_ERROR(...)    CIULog::Log(LOG_LEVEL_ERROR, __FUNCSIG__,__LINE__, __VA_ARGS__)

class CIULog
{
public:
    static bool Init(bool bToFile, bool bTruncateLongLog, PCTSTR pszLogFileName);
    static void Uninit();

    static void SetLevel(LOG_LEVEL nLevel);

    //&#x4E0D;&#x8F93;&#x51FA;&#x7EBF;&#x7A0B;ID&#x53F7;&#x548C;&#x6240;&#x5728;&#x51FD;&#x6570;&#x7B7E;&#x540D;&#x3001;&#x884C;&#x53F7;
    static bool Log(long nLevel, PCTSTR pszFmt, ...);
    //&#x8F93;&#x51FA;&#x7EBF;&#x7A0B;ID&#x53F7;&#x548C;&#x6240;&#x5728;&#x51FD;&#x6570;&#x7B7E;&#x540D;&#x3001;&#x884C;&#x53F7;
    static bool Log(long nLevel, PCSTR pszFunctionSig, int nLineNo, PCTSTR pszFmt, ...);        //&#x6CE8;&#x610F;:pszFunctionSig&#x53C2;&#x6570;&#x4E3A;Ansic&#x7248;&#x672C;
    static bool Log(long nLevel, PCSTR pszFunctionSig, int nLineNo, PCSTR pszFmt, ...);
private:
    CIULog() = delete;
    ~CIULog() = delete;

    CIULog(const CIULog&amp; rhs) = delete;
    CIULog&amp; operator=(const CIULog&amp; rhs) = delete;

    static void GetTime(char* pszTime, int nTimeStrLength);

private:
    static bool             m_bToFile;              //&#x65E5;&#x5FD7;&#x5199;&#x5165;&#x6587;&#x4EF6;&#x8FD8;&#x662F;&#x5199;&#x5230;&#x63A7;&#x5236;&#x53F0;  
    static HANDLE           m_hLogFile;
    static bool             m_bTruncateLongLog;     //&#x957F;&#x65E5;&#x5FD7;&#x662F;&#x5426;&#x622A;&#x65AD;
    static LOG_LEVEL        m_nLogLevel;            //&#x65E5;&#x5FD7;&#x7EA7;&#x522B;
};

#endif // !__LOG_H__
</code></pre><p><strong>&#x65E5;&#x5FD7;&#x7684; cpp &#x6587;&#x4EF6;</strong></p>
<pre class="language-"><code>/**
 *@desc:   IULog.cpp
 *@author: zhangyl
 *@date:   2014.12.25
 */
#include &quot;stdafx.h&quot;
#include &quot;IULog.h&quot;
#include &quot;EncodingUtil.h&quot;
#include <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>tchar.h</span><span class="token punctuation">&gt;</span></span>

#ifndef LOG_OUTPUT
#define LOG_OUTPUT
#endif

#define MAX_LINE_LENGTH 256

bool CIULog::m_bToFile = false;
bool CIULog::m_bTruncateLongLog = false;
HANDLE CIULog::m_hLogFile = INVALID_HANDLE_VALUE;
LOG_LEVEL CIULog::m_nLogLevel = LOG_LEVEL_INFO;

bool CIULog::Init(bool bToFile, bool bTruncateLongLog, PCTSTR pszLogFileName)
{
#ifdef LOG_OUTPUT
    m_bToFile = bToFile;
    m_bTruncateLongLog = bTruncateLongLog;

    if (pszLogFileName == NULL || pszLogFileName[0] == NULL)
        return FALSE;

    TCHAR szHomePath[MAX_PATH] = {0};
    ::GetModuleFileName(NULL, szHomePath, MAX_PATH);
    for (int i = _tcslen(szHomePath); i &gt;= 0; --i)
    {
        if (szHomePath[i] == _T(&apos;\\&apos;))
        {
            szHomePath[i] = _T(&apos;\0&apos;);
            break;
        }
    }

    TCHAR szLogDirectory[MAX_PATH] = { 0 };
    _stprintf_s(szLogDirectory, _T(&quot;%s\\Logs\\&quot;), szHomePath);

    DWORD dwAttr = ::GetFileAttributes(szLogDirectory);
    if (!((dwAttr != 0xFFFFFFFF) &amp;&amp; (dwAttr &amp; FILE_ATTRIBUTE_DIRECTORY)))
    {
        TCHAR cPath[MAX_PATH] = { 0 };
        TCHAR cTmpPath[MAX_PATH] = { 0 };
        TCHAR* lpPos = NULL;
        TCHAR cTmp = _T(&apos;\0&apos;);

        _tcsncpy_s(cPath, szLogDirectory, MAX_PATH);

        for (int i = 0; i &lt; (int)_tcslen(cPath); i++)
        {
            if (_T(&apos;\\&apos;) == cPath[i])
                cPath[i] = _T(&apos;/&apos;);
        }

        lpPos = _tcschr(cPath, _T(&apos;/&apos;));
        while (lpPos != NULL)
        {
            if (lpPos == cPath)
            {
                lpPos++;
            }
            else
            {
                cTmp = *lpPos;
                *lpPos = _T(&apos;\0&apos;);
                _tcsncpy_s(cTmpPath, cPath, MAX_PATH);
                ::CreateDirectory(cTmpPath, NULL);
                *lpPos = cTmp;
                lpPos++;
            }
            lpPos = _tcschr(lpPos, _T(&apos;/&apos;));
        }
    }

    m_hLogFile = ::CreateFile(pszLogFileName, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL);
    if (m_hLogFile == INVALID_HANDLE_VALUE)
        return false;

#endif // end LOG_OUTPUT

    return true;
}

void CIULog::Uninit()
{
#ifdef LOG_OUTPUT
    if(m_hLogFile != INVALID_HANDLE_VALUE)
    {
        ::CloseHandle(m_hLogFile);
        m_hLogFile = INVALID_HANDLE_VALUE;
    }
#endif //end LOG_OUTPUT
}

void CIULog::SetLevel(LOG_LEVEL nLevel)
{
    m_nLogLevel = nLevel;
}

bool CIULog::Log(long nLevel, PCTSTR pszFmt, ...)
{
#ifdef LOG_OUTPUT
    if (nLevel &lt; m_nLogLevel)
        return false;

    char szTime[64] = { 0 };
    GetTime(szTime,ARRAYSIZE(szTime));
    std::string strDebugInfo(szTime);

    std::string strLevel(&quot;[INFO]&quot;);
    if (nLevel == LOG_LEVEL_WARNING)
        strLevel = &quot;[Warning]&quot;;
    else if (nLevel == LOG_LEVEL_ERROR)
        strLevel = &quot;[Error]&quot;;

    strDebugInfo += strLevel;

    //&#x5F53;&#x524D;&#x7EBF;&#x7A0B;&#x4FE1;&#x606F;
    char szThreadID[32] = { 0 };
    DWORD dwThreadID = ::GetCurrentThreadId();
    sprintf_s(szThreadID, ARRAYSIZE(szThreadID), &quot;[ThreadID: %u]&quot;, dwThreadID);  
    strDebugInfo += szThreadID;

    //log&#x6B63;&#x6587;
    std::wstring strLogMsg;
    va_list ap;
    va_start(ap, pszFmt);
    int nLogMsgLength = _vsctprintf(pszFmt, ap);
    //&#x5BB9;&#x91CF;&#x5FC5;&#x987B;&#x7B97;&#x4E0A;&#x6700;&#x540E;&#x4E00;&#x4E2A;\0
    if ((int)strLogMsg.capacity() &lt; nLogMsgLength + 1)
    {
        strLogMsg.resize(nLogMsgLength + 1);
    }
    _vstprintf_s((TCHAR*)strLogMsg.data(), strLogMsg.capacity(), pszFmt, ap);
    va_end(ap);

    //string&#x5185;&#x5BB9;&#x6B63;&#x786E;&#x4F46;length&#x4E0D;&#x5BF9;&#xFF0C;&#x6062;&#x590D;&#x4E00;&#x4E0B;&#x5176;length
    std::wstring strMsgFormal;
    strMsgFormal.append(strLogMsg.c_str(), nLogMsgLength);

    //&#x5982;&#x679C;&#x65E5;&#x5FD7;&#x5F00;&#x542F;&#x622A;&#x65AD;&#xFF0C;&#x957F;&#x65E5;&#x5FD7;&#x53EA;&#x53D6;&#x524D;MAX_LINE_LENGTH&#x4E2A;&#x5B57;&#x7B26;
    if (m_bTruncateLongLog)
        strMsgFormal = strMsgFormal.substr(0, MAX_LINE_LENGTH);

    std::string strLogMsgAscii;
    strLogMsgAscii = EncodeUtil::UnicodeToAnsi(strMsgFormal);

    strDebugInfo += strLogMsgAscii;
    strDebugInfo += &quot;\r\n&quot;;

    if(m_bToFile)
    {
        if(m_hLogFile == INVALID_HANDLE_VALUE)
            return false;

        ::SetFilePointer(m_hLogFile, 0, NULL, FILE_END);
        DWORD dwBytesWritten = 0;       
        ::WriteFile(m_hLogFile, strDebugInfo.c_str(), strDebugInfo.length(), &amp;dwBytesWritten, NULL);
        ::FlushFileBuffers(m_hLogFile);
        return true;
    }

    ::OutputDebugStringA(strDebugInfo.c_str());

#endif // end LOG_OUTPUT

    return true;
}

bool CIULog::Log(long nLevel, PCSTR pszFunctionSig, int nLineNo, PCTSTR pszFmt, ...)
{
#ifdef LOG_OUTPUT
    if (nLevel &lt; m_nLogLevel)
        return false;

    //&#x65F6;&#x95F4;
    char szTime[64] = { 0 };
    GetTime(szTime, ARRAYSIZE(szTime));
    std::string strDebugInfo(szTime);

    //&#x9519;&#x8BEF;&#x7EA7;&#x522B;
    std::string strLevel(&quot;[INFO]&quot;);
    if (nLevel == LOG_LEVEL_WARNING)
        strLevel = &quot;[Warning]&quot;;
    else if (nLevel == LOG_LEVEL_ERROR)
        strLevel = &quot;[Error]&quot;;

    strDebugInfo += strLevel;

    //&#x5F53;&#x524D;&#x7EBF;&#x7A0B;&#x4FE1;&#x606F;
    char szThreadID[32] = {0};
    DWORD dwThreadID = ::GetCurrentThreadId();
    sprintf_s(szThreadID, ARRAYSIZE(szThreadID), &quot;[ThreadID: %u]&quot;, dwThreadID);
    strDebugInfo += szThreadID;

    //&#x51FD;&#x6570;&#x7B7E;&#x540D;
    char szFuncSig[512] = { 0 };
    sprintf_s(szFuncSig, &quot;[%s:%d]&quot;, pszFunctionSig, nLineNo);
    strDebugInfo += szFuncSig;

    //log&#x6B63;&#x6587;
    std::wstring strLogMsg;
    va_list ap;
    va_start(ap, pszFmt);
    int nLogMsgLength = _vsctprintf(pszFmt, ap);
    //&#x5BB9;&#x91CF;&#x5FC5;&#x987B;&#x7B97;&#x4E0A;&#x6700;&#x540E;&#x4E00;&#x4E2A;\0 
    if ((int)strLogMsg.capacity() &lt; nLogMsgLength + 1)
    {
        strLogMsg.resize(nLogMsgLength + 1);
    }
    _vstprintf_s((TCHAR*)strLogMsg.data(), strLogMsg.capacity(), pszFmt, ap);
    va_end(ap);

    //string&#x5185;&#x5BB9;&#x6B63;&#x786E;&#x4F46;length&#x4E0D;&#x5BF9;&#xFF0C;&#x6062;&#x590D;&#x4E00;&#x4E0B;&#x5176;length
    std::wstring strMsgFormal;
    strMsgFormal.append(strLogMsg.c_str(), nLogMsgLength);

    //&#x5982;&#x679C;&#x65E5;&#x5FD7;&#x5F00;&#x542F;&#x622A;&#x65AD;&#xFF0C;&#x957F;&#x65E5;&#x5FD7;&#x53EA;&#x53D6;&#x524D;MAX_LINE_LENGTH&#x4E2A;&#x5B57;&#x7B26;
    if (m_bTruncateLongLog)
        strMsgFormal = strMsgFormal.substr(0, MAX_LINE_LENGTH);

    std::string strLogMsgAscii;
    strLogMsgAscii = EncodeUtil::UnicodeToAnsi(strMsgFormal);

    strDebugInfo += strLogMsgAscii;
    strDebugInfo += &quot;\r\n&quot;;

    if(m_bToFile)
    {
        if(m_hLogFile == INVALID_HANDLE_VALUE)
            return false;

        ::SetFilePointer(m_hLogFile, 0, NULL, FILE_END);
        DWORD dwBytesWritten = 0;
        ::WriteFile(m_hLogFile, strDebugInfo.c_str(), strDebugInfo.length(), &amp;dwBytesWritten, NULL);
        ::FlushFileBuffers(m_hLogFile);
        return true;
    }

    ::OutputDebugStringA(strDebugInfo.c_str());

#endif // end LOG_OUTPUT

    return true;
}

bool CIULog::Log(long nLevel, PCSTR pszFunctionSig, int nLineNo, PCSTR pszFmt, ...)
{
#ifdef LOG_OUTPUT
    if (nLevel &lt; m_nLogLevel)
        return false;

    //&#x65F6;&#x95F4;
    char szTime[64] = { 0 };
    GetTime(szTime, ARRAYSIZE(szTime));
    std::string strDebugInfo(szTime);

    //&#x9519;&#x8BEF;&#x7EA7;&#x522B;
    std::string strLevel(&quot;[INFO]&quot;);
    if (nLevel == LOG_LEVEL_WARNING)
        strLevel = &quot;[Warning]&quot;;
    else if (nLevel == LOG_LEVEL_ERROR)
        strLevel = &quot;[Error]&quot;;

    strDebugInfo += strLevel;

    //&#x5F53;&#x524D;&#x7EBF;&#x7A0B;&#x4FE1;&#x606F;
    char szThreadID[32] = {0};
    DWORD dwThreadID = ::GetCurrentThreadId();
    sprintf_s(szThreadID, ARRAYSIZE(szThreadID), &quot;[ThreadID: %u]&quot;, dwThreadID);
    strDebugInfo += szThreadID;

    //&#x51FD;&#x6570;&#x7B7E;&#x540D;
    char szFuncSig[512] = { 0 };
    sprintf_s(szFuncSig, &quot;[%s:%d]&quot;, pszFunctionSig, nLineNo);
    strDebugInfo += szFuncSig;

    //&#x65E5;&#x5FD7;&#x6B63;&#x6587;
    std::string strLogMsg;
    va_list ap;
    va_start(ap, pszFmt);
    int nLogMsgLength = _vscprintf(pszFmt, ap);
    //&#x5BB9;&#x91CF;&#x5FC5;&#x987B;&#x7B97;&#x4E0A;&#x6700;&#x540E;&#x4E00;&#x4E2A;\0
    if ((int)strLogMsg.capacity() &lt; nLogMsgLength + 1)
    {
        strLogMsg.resize(nLogMsgLength + 1);
    }
    vsprintf_s((char*)strLogMsg.data(), strLogMsg.capacity(), pszFmt, ap);
    va_end(ap);

    //string&#x5185;&#x5BB9;&#x6B63;&#x786E;&#x4F46;length&#x4E0D;&#x5BF9;&#xFF0C;&#x6062;&#x590D;&#x4E00;&#x4E0B;&#x5176;length
    std::string strMsgFormal;
    strMsgFormal.append(strLogMsg.c_str(), nLogMsgLength);

    //&#x5982;&#x679C;&#x65E5;&#x5FD7;&#x5F00;&#x542F;&#x622A;&#x65AD;&#xFF0C;&#x957F;&#x65E5;&#x5FD7;&#x53EA;&#x53D6;&#x524D;MAX_LINE_LENGTH&#x4E2A;&#x5B57;&#x7B26;
    if (m_bTruncateLongLog)
        strMsgFormal = strMsgFormal.substr(0, MAX_LINE_LENGTH);

    strDebugInfo += strMsgFormal;
    strDebugInfo += &quot;\r\n&quot;;

    if(m_bToFile)
    {
        if(m_hLogFile == INVALID_HANDLE_VALUE)
            return false;

        ::SetFilePointer(m_hLogFile, 0, NULL, FILE_END);
        DWORD dwBytesWritten = 0;
        ::WriteFile(m_hLogFile, strDebugInfo.c_str(), strDebugInfo.length(), &amp;dwBytesWritten, NULL);
        ::FlushFileBuffers(m_hLogFile);
        return true;
    }

    ::OutputDebugStringA(strDebugInfo.c_str());

#endif // end LOG_OUTPUT

    return true;
}

void CIULog::GetTime(char* pszTime, int nTimeStrLength)
{
    SYSTEMTIME st = {0};
    ::GetLocalTime(&amp;st);
    sprintf_s(pszTime, nTimeStrLength, &quot;[%04d-%02d-%02d %02d:%02d:%02d:%04d]&quot;, st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, st.wMilliseconds);
}
</code></pre><p>&#x4E0A;&#x8FF0;&#x4EE3;&#x7801;&#x4E2D;&#x6839;&#x636E;&#x65E5;&#x5FD7;&#x7EA7;&#x522B;&#x5B9A;&#x4E49;&#x4E86;&#x4E09;&#x4E2A;&#x5B8F; <strong>LOG_INFO</strong>&#x3001;<strong>LOG_WARNING</strong>&#x3001;<strong>LOG_ERROR</strong>&#xFF0C;&#x5982;&#x679C;&#x8981;&#x4F7F;&#x7528;&#x8BE5;&#x65E5;&#x5FD7;&#x6A21;&#x5757;&#xFF0C;&#x53EA;&#x9700;&#x8981;&#x5728;&#x7A0B;&#x5E8F;&#x542F;&#x52A8;&#x5904;&#x7684;&#x5730;&#x65B9;&#x8C03;&#x7528; <strong>CIULog::Init</strong> &#x51FD;&#x6570;&#x521D;&#x59CB;&#x5316;&#x65E5;&#x5FD7;&#xFF1A;</p>
<pre class="language-"><code>SYSTEMTIME st = {0};
::GetLocalTime(&amp;st);
TCHAR szLogFileName[MAX_PATH] = {0};
_stprintf_s(szLogFileName, MAX_PATH, _T(&quot;%s\\Logs\\%04d%02d%02d%02d%02d%02d.log&quot;), g_szHomePath, st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond);
CIULog::Init(true, false, szLogFileName);
</code></pre><p>&#x5F53;&#x7136;&#xFF0C;&#x6700;&#x4F73;&#x7684;&#x505A;&#x6CD5;&#xFF0C;&#x5728;&#x7A0B;&#x5E8F;&#x9000;&#x51FA;&#x7684;&#x5730;&#x65B9;&#xFF0C;&#x8C03;&#x7528; <strong>CIULog::Uninit</strong> &#x56DE;&#x6536;&#x65E5;&#x5FD7;&#x6A21;&#x5757;&#x76F8;&#x5173;&#x7684;&#x8D44;&#x6E90;&#xFF1A;</p>
<pre class="language-"><code>CIULog::Uninit();
</code></pre><p>&#x5728;&#x505A;&#x597D;&#x8FD9;&#x4E9B;&#x51C6;&#x5907;&#x5DE5;&#x4F5C;&#x4EE5;&#x540E;&#xFF0C;&#x5982;&#x679C;&#x4F60;&#x60F3;&#x5728;&#x7A0B;&#x5E8F;&#x7684;&#x67D0;&#x4E2A;&#x5730;&#x65B9;&#x5199;&#x4E00;&#x6761;&#x65E5;&#x5FD7;&#xFF0C;&#x53EA;&#x9700;&#x8981;&#x8FD9;&#x6837;&#x5199;&#xFF1A;</p>
<pre class="language-"><code>//&#x6253;&#x5370;&#x4E00;&#x6761; INFO &#x7EA7;&#x522B;&#x7684;&#x65E5;&#x5FD7;
LOG_INFO(&quot;Request logon: Account=%s, Password=*****, Status=%d, LoginType=%d.&quot;, pLoginRequest-&gt;m_szAccountName, pLoginRequest-&gt;m_szPassword, pLoginRequest-&gt;m_nStatus, (long)pLoginRequest-&gt;m_nLoginType);
//&#x6253;&#x5370;&#x4E00;&#x6761; WARNING &#x7EA7;&#x522B;&#x7684;&#x65E5;&#x5FD7;
LOG_WARN(&quot;Some warning...&quot;);
//&#x6253;&#x5370;&#x4E00;&#x6761; ERROR &#x7EA7;&#x522B;&#x7684;&#x65E5;&#x5FD7;
LOG_ERROR(&quot;Recv data error, errorNO=%d.&quot;, ::WSAGetLastError());
</code></pre><p>&#x5173;&#x4E8E; <strong>CIULog</strong> &#x8FD9;&#x4E2A;&#x65E5;&#x5FD7;&#x6A21;&#x5757;&#x7C7B;&#xFF0C;&#x5982;&#x679C;&#x8BFB;&#x8005;&#x8981;&#x60F3;&#x5B9E;&#x9645;&#x8FD0;&#x884C;&#x67E5;&#x770B;&#x6548;&#x679C;&#xFF0C;&#x53EF;&#x4EE5;&#x4ECE;&#x94FE;&#x63A5;&#xFF08;<a href="https://github.com/baloonwj/flamingo/tree/master/flamingoclient" target="_blank">https://github.com/baloonwj/flamingo/tree/master/flamingoclient</a> &#xFF09;&#x4E0B;&#x8F7D;&#x5B8C;&#x6574;&#x7684;&#x9879;&#x76EE;&#x4EE3;&#x7801;&#x6765;&#x8FD0;&#x884C;&#x3002;&#x8BE5;&#x65E5;&#x5FD7;&#x8F93;&#x51FA;&#x6548;&#x679C;&#x5982;&#x4E0B;&#xFF1A;</p>
<pre class="language-"><code>[2018-11-09 23:52:54:0826][INFO][ThreadID: 7252][bool __thiscall CIUSocket::Login(const char *,const char *,int,int,int,class std::basic_string<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>char,struct</span> <span class="token attr-name"><span class="token namespace">std:</span>:char_traits&lt;char</span><span class="token punctuation">&gt;</span></span>,class std::allocator<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>char</span><span class="token punctuation">&gt;</span></span> &gt; &amp;):1107]Request logon: Account=zhangy, Password=*****, Status=76283204, LoginType=1.
[2018-11-09 23:52:56:0352][INFO][ThreadID: 5828][void __thiscall CIUSocket::SendThreadProc(void):794]Recv data thread start...
[2018-11-09 23:52:56:0385][INFO][ThreadID: 6032][void __thiscall CSendMsgThread::HandleUserBasicInfo(const class CUserBasicInfoRequest *):298]Request to get userinfo.
[2018-11-09 23:52:56:0355][INFO][ThreadID: 7140][void __thiscall CIUSocket::RecvThreadProc(void):842]Recv data thread start...
[2018-11-09 23:52:57:0254][INFO][ThreadID: 7220][int __thiscall CRecvMsgThread::HandleFriendListInfo(const class std::basic_string<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>char,struct</span> <span class="token attr-name"><span class="token namespace">std:</span>:char_traits&lt;char</span><span class="token punctuation">&gt;</span></span>,class std::allocator<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>char</span><span class="token punctuation">&gt;</span></span> &gt; &amp;):593]Recv user basic info, info count=1.
</code></pre><h5 id="&#x591A;&#x7EBF;&#x7A0B;&#x540C;&#x6B65;&#x5199;&#x65E5;&#x5FD7;&#x51FA;&#x73B0;&#x7684;&#x95EE;&#x9898;&#x4E00;"><a name="&#x591A;&#x7EBF;&#x7A0B;&#x540C;&#x6B65;&#x5199;&#x65E5;&#x5FD7;&#x51FA;&#x73B0;&#x7684;&#x95EE;&#x9898;&#x4E00;" class="anchor-navigation-ex-anchor" href="#&#x591A;&#x7EBF;&#x7A0B;&#x540C;&#x6B65;&#x5199;&#x65E5;&#x5FD7;&#x51FA;&#x73B0;&#x7684;&#x95EE;&#x9898;&#x4E00;"><i class="fa fa-link" aria-hidden="true"></i></a>&#x591A;&#x7EBF;&#x7A0B;&#x540C;&#x6B65;&#x5199;&#x65E5;&#x5FD7;&#x51FA;&#x73B0;&#x7684;&#x95EE;&#x9898;&#x4E00;</h5>
<p>&#x4ECE;&#x4E0A;&#x9762;&#x7684;&#x65E5;&#x5FD7;&#x8F93;&#x51FA;&#x6765;&#x770B;&#xFF0C;&#x8FD9;&#x79CD;&#x540C;&#x6B65;&#x7684;&#x65E5;&#x5FD7;&#x8F93;&#x51FA;&#x65B9;&#x5F0F;&#xFF0C;&#x4E5F;&#x5B58;&#x5728;&#x65F6;&#x95F4;&#x987A;&#x5E8F;&#x4E0D;&#x6B63;&#x786E;&#x7684;&#x95EE;&#x9898;&#xFF08;&#x65F6;&#x95F4;&#x6233;&#x5927;&#x7684;&#x65E5;&#x5FD7;&#x6BD4;&#x65F6;&#x95F4;&#x6233;&#x5C0F;&#x7684;&#x65E5;&#x5FD7;&#x9760;&#x524D;&#xFF09;&#x3002;&#x8FD9;&#x662F;&#x7531;&#x4E8E;&#x591A;&#x7EBF;&#x7A0B;&#x540C;&#x65F6;&#x5199;&#x65E5;&#x5FD7;&#x5230;&#x540C;&#x4E00;&#x4E2A;&#x6587;&#x4EF6;&#x65F6;&#xFF0C;&#x4EA7;&#x751F;&#x65E5;&#x5FD7;&#x7684;&#x65F6;&#x95F4;&#x548C;&#x5B9E;&#x9645;&#x5199;&#x5165;&#x78C1;&#x76D8;&#x7684;&#x65F6;&#x95F4;&#x4E0D;&#x662F;&#x4E00;&#x4E2A;&#x539F;&#x5B50;&#x64CD;&#x4F5C;&#x3002;&#x4E0B;&#x56FE;&#x89E3;&#x91CA;&#x4E86;&#x8BE5;&#x73B0;&#x8C61;&#x51FA;&#x73B0;&#x7684;&#x6839;&#x6E90;&#xFF1A;</p>
<p><img src="../imgs/log1.png" alt=""></p>
<p>&#x591A;&#x7EBF;&#x7A0B;&#x5199;&#x540C;&#x4E00;&#x4E2A;&#x65E5;&#x5FD7;&#x6587;&#x4EF6;&#x51FA;&#x73B0;&#x5148;&#x4EA7;&#x751F;&#x7684;&#x65E5;&#x5FD7;&#x540E;&#x5199;&#x5165;&#x5230;&#x6587;&#x4EF6;&#x4E2D;&#x7684;&#x73B0;&#x8C61;</p>
<p>&#x597D;&#x5728;&#x8FD9;&#x79CD;&#x65F6;&#x95F4;&#x987A;&#x5E8F;&#x4E0D;&#x6B63;&#x786E;&#x53EA;&#x4F1A;&#x51FA;&#x73B0;&#x5728;&#x4E0D;&#x540C;&#x7EBF;&#x7A0B;&#x4E4B;&#x95F4;&#xFF0C;&#x5BF9;&#x4E8E;&#x540C;&#x4E00;&#x4E2A;&#x7EBF;&#x7A0B;&#x7684;&#x4E0D;&#x540C;&#x65F6;&#x95F4;&#x7684;&#x65E5;&#x5FD7;&#x8BB0;&#x5F55;&#x987A;&#x5E8F;&#x80AF;&#x5B9A;&#x662F;&#x6B63;&#x786E;&#x7684;&#x3002;&#x6240;&#x4EE5;&#x8FD9;&#x79CD;&#x65E5;&#x671F;&#x9519;&#x4E71;&#x73B0;&#x8C61;&#xFF0C;&#x5E76;&#x4E0D;&#x5F71;&#x54CD;&#x6211;&#x4EEC;&#x4F7F;&#x7528;&#x65E5;&#x5FD7;&#x3002;</p>
<h5 id="&#x591A;&#x7EBF;&#x7A0B;&#x540C;&#x6B65;&#x5199;&#x65E5;&#x5FD7;&#x51FA;&#x73B0;&#x7684;&#x95EE;&#x9898;&#x4E8C;"><a name="&#x591A;&#x7EBF;&#x7A0B;&#x540C;&#x6B65;&#x5199;&#x65E5;&#x5FD7;&#x51FA;&#x73B0;&#x7684;&#x95EE;&#x9898;&#x4E8C;" class="anchor-navigation-ex-anchor" href="#&#x591A;&#x7EBF;&#x7A0B;&#x540C;&#x6B65;&#x5199;&#x65E5;&#x5FD7;&#x51FA;&#x73B0;&#x7684;&#x95EE;&#x9898;&#x4E8C;"><i class="fa fa-link" aria-hidden="true"></i></a>&#x591A;&#x7EBF;&#x7A0B;&#x540C;&#x6B65;&#x5199;&#x65E5;&#x5FD7;&#x51FA;&#x73B0;&#x7684;&#x95EE;&#x9898;&#x4E8C;</h5>
<p>&#x591A;&#x7EBF;&#x7A0B;&#x540C;&#x65F6;&#x5199;&#x5165;&#x540C;&#x4E00;&#x4E2A;&#x65E5;&#x5FD7;&#x6587;&#x4EF6;&#x8FD8;&#x6709;&#x4E00;&#x4E2A;&#x95EE;&#x9898;&#xFF0C;&#x5C31;&#x662F;&#x5047;&#x8BBE;&#x7EBF;&#x7A0B; A &#x5199;&#x67D0;&#x4E00;&#x4E2A;&#x65F6;&#x523B;&#x8FFD;&#x52A0;&#x65E5;&#x5FD7;&#x5185;&#x5BB9;&#x4E3A; &#x201C;AAAAA&#x201D; &#xFF0C;&#x7EBF;&#x7A0B; B &#x5728;&#x540C;&#x4E00;&#x65F6;&#x523B;&#x8FFD;&#x52A0;&#x65E5;&#x5FD7;&#x5185;&#x5BB9;&#x4E3A; &#x201C;BBBBB&#x201D; &#xFF0C;&#x7EBF;&#x7A0B; C &#x5728;&#x540C;&#x4E00;&#x65F6;&#x523B;&#x8FFD;&#x52A0;&#x65E5;&#x5FD7;&#x5185;&#x5BB9;&#x4E3A; &#x201C;CCCCC&#x201D; &#xFF0C;&#x90A3;&#x4E48;&#x6700;&#x7EC8;&#x7684;&#x65E5;&#x5FD7;&#x6587;&#x4EF6;&#x4E2D;&#x7684;&#x5185;&#x5BB9;&#x4F1A;&#x4E0D;&#x4F1A;&#x51FA;&#x73B0; &#x201C;AABBCCABCAACCBB&#x201D; &#x8FD9;&#x79CD;&#x683C;&#x5F0F;&#xFF1F;</p>
<p>&#x5728;&#x7C7B; Unix &#x7CFB;&#x7EDF;&#x4E0A;&#xFF08;&#x5305;&#x62EC; Linux&#xFF09;&#xFF0C;&#x540C;&#x4E00;&#x4E2A;&#x8FDB;&#x7A0B;&#x5185;&#x9488;&#x5BF9;&#x540C;&#x4E00;&#x4E2A; <strong>FILE*</strong> &#x7684;&#x64CD;&#x4F5C;&#x662F;&#x7EBF;&#x7A0B;&#x5B89;&#x5168;&#x7684;&#xFF0C;&#x4E5F;&#x5C31;&#x662F;&#x8BF4;&#xFF0C;&#x5728;&#x8FD9;&#x7C7B;&#x64CD;&#x4F5C;&#x7CFB;&#x7EDF;&#x4E0A;&#x5F97;&#x5230;&#x7684;&#x65E5;&#x5FD7;&#x7ED3;&#x679C; A&#x3001;B&#x3001;C &#x5404;&#x4E2A;&#x5B57;&#x6BCD;&#x7EC4;&#x4E00;&#x5B9A;&#x662F;&#x8FDE;&#x7EED;&#x5728;&#x4E00;&#x8D77;&#xFF0C;&#x4E5F;&#x5C31;&#x662F;&#x8BF4;&#x6700;&#x7EC8;&#x5F97;&#x5230;&#x7684;&#x65E5;&#x5FD7;&#x5185;&#x5BB9;&#x53EF;&#x80FD;&#x662F; &#x201C;<strong>AAAAACCCCCBBBBB</strong>&#x201D; &#x6216; &#x201C;<strong>AAAAABBBBBCCCCC</strong>&#x201D; &#x7B49;&#x8FD9;&#x79CD;&#x8FDE;&#x7EED;&#x7684;&#x683C;&#x5F0F;&#xFF0C;&#x7EDD;&#x4E0D;&#x4F1A;&#x51FA;&#x73B0; A&#x3001;B&#x3001;C &#x5B57;&#x6BCD;&#x4EA4;&#x9519;&#x76F8;&#x95F4;&#x7684;&#x73B0;&#x8C61;&#x3002;</p>
<p>&#x800C;&#x5728;Windows&#x7CFB;&#x7EDF;&#x4E0A;&#xFF0C;&#x5BF9;&#x4E8E; <strong>FILE*</strong> &#x7684;&#x64CD;&#x4F5C;&#x5E76;&#x4E0D;&#x662F;&#x7EBF;&#x7A0B;&#x5B89;&#x5168;&#x7684;&#x3002;&#x4F46;&#x662F;&#x7B14;&#x8005;&#x505A;&#x4E86;&#x5927;&#x91CF;&#x5B9E;&#x9A8C;&#xFF0C;&#x5728; Windows &#x7CFB;&#x7EDF;&#x4E0A;&#x4E5F;&#x6CA1;&#x6709;&#x51FA;&#x73B0;&#x8FD9;&#x79CD; A&#x3001;B&#x3001;C &#x5B57;&#x6BCD;&#x76F8;&#x95F4;&#x7684;&#x73B0;&#x8C61;&#x3002;&#xFF08;&#x5173;&#x4E8E;&#x8FD9;&#x4E2A;&#x95EE;&#x9898;&#x7684;&#x8BA8;&#x8BBA;&#xFF0C;&#x53EF;&#x4EE5;&#x53C2;&#x8003;&#x8FD9;&#x91CC;&#xFF1A;<a href="https://www.zhihu.com/question/40472431" target="_blank">https://www.zhihu.com/question/40472431</a> &#xFF09;</p>
<p>&#x8FD9;&#x79CD;&#x540C;&#x6B65;&#x65E5;&#x5FD7;&#x7684;&#x5B9E;&#x73B0;&#x65B9;&#x5F0F;&#xFF0C;&#x4E00;&#x822C;&#x7528;&#x4E8E;&#x4F4E;&#x9891;&#x5199;&#x65E5;&#x5FD7;&#x7684;&#x8F6F;&#x4EF6;&#x7CFB;&#x7EDF;&#x4E2D;&#xFF08;&#x5982;&#x5BA2;&#x6237;&#x7AEF;&#x8F6F;&#x4EF6;&#xFF09;&#xFF0C;&#x6240;&#x4EE5;&#x6211;&#x53EF;&#x4EE5;&#x8BA4;&#x4E3A;&#x8FD9;&#x79CD;&#x591A;&#x7EBF;&#x7A0B;&#x540C;&#x65F6;&#x5199;&#x65E5;&#x5FD7;&#x5230;&#x4E00;&#x4E2A;&#x6587;&#x4EF6;&#x4E2D;&#x662F;&#x53EF;&#x884C;&#x7684;&#x3002;</p>
<h4 id="&#x5F02;&#x6B65;&#x5199;&#x65E5;&#x5FD7;"><a name="&#x5F02;&#x6B65;&#x5199;&#x65E5;&#x5FD7;" class="anchor-navigation-ex-anchor" href="#&#x5F02;&#x6B65;&#x5199;&#x65E5;&#x5FD7;"><i class="fa fa-link" aria-hidden="true"></i></a>&#x5F02;&#x6B65;&#x5199;&#x65E5;&#x5FD7;</h4>
<p>&#x5F53;&#x7136;&#xFF0C;&#x5BF9;&#x4E8E;&#x6027;&#x80FD;&#x8981;&#x6C42;&#x4E0D;&#x9AD8;&#x7684;&#x5E94;&#x7528;&#xFF08;&#x5982;&#x5927;&#x591A;&#x6570;&#x5BA2;&#x6237;&#x7AEF;&#x7A0B;&#x5E8F;&#x3001;&#x67D0;&#x4E9B;&#x5E76;&#x53D1;&#x6570;&#x91CF;&#x4E0D;&#x9AD8;&#x7684;&#x670D;&#x52A1;&#xFF09;&#x6765;&#x8BF4;&#xFF0C;&#x8FD9;&#x79CD;&#x540C;&#x6B65;&#x5199;&#x65E5;&#x5FD7;&#x7684;&#x5B9E;&#x73B0;&#x65B9;&#x5F0F;&#x662F;&#x53EF;&#x4EE5;&#x6EE1;&#x8DB3;&#x8981;&#x6C42;&#x7684;&#x3002;&#x4F46;&#x662F;&#x5BF9;&#x4E8E; QPS &#x8981;&#x6C42;&#x5F88;&#x9AD8;&#x6216;&#x8005;&#x5BF9;&#x6027;&#x80FD;&#x6709;&#x4E00;&#x5B9A;&#x8981;&#x6C42;&#x7684;&#x670D;&#x52A1;&#x5668;&#x7A0B;&#x5E8F;&#xFF0C;&#x540C;&#x6B65;&#x5199;&#x65E5;&#x5FD7;&#x7B49;&#x5F85;&#x78C1;&#x76D8; IO &#x7684;&#x5B8C;&#x6210;&#x5BF9;&#x4E8E;&#x670D;&#x52A1;&#x7684;&#x5173;&#x952E;&#x6027;&#x903B;&#x8F91;&#x7684;&#x5FEB;&#x901F;&#x6267;&#x884C;&#x548C;&#x53CA;&#x65F6;&#x54CD;&#x5E94;&#x6027;&#x4F1A;&#x9020;&#x6210;&#x4E00;&#x5B9A;&#x7684;&#x6027;&#x80FD;&#x635F;&#x5931;&#x3002;&#x4E3A;&#x4E86;&#x51CF;&#x5C0F;&#x8FD9;&#x79CD;&#x635F;&#x5931;&#xFF0C;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x91C7;&#x7528;&#x5F02;&#x6B65;&#x65E5;&#x5FD7;&#x3002;</p>
<p>&#x6240;&#x8C13;&#x5F02;&#x6B65;&#x5199;&#x65E5;&#x5FD7;&#xFF0C;&#x4E0E;&#x540C;&#x6B65;&#x5199;&#x65E5;&#x5FD7;&#x76F8;&#x53CD;&#xFF0C;&#x5373;&#x4EA7;&#x751F;&#x65E5;&#x5FD7;&#x7684;&#x5730;&#x65B9;&#xFF0C;&#x4E0D;&#x4F1A;&#x5C06;&#x65E5;&#x5FD7;&#x5B9E;&#x65F6;&#x5199;&#x5165;&#x5230;&#x6587;&#x4EF6;&#x4E2D;&#x53BB;&#xFF0C;&#x800C;&#x662F;&#x901A;&#x8FC7;&#x4E00;&#x4E9B;&#x7EBF;&#x7A0B;&#x540C;&#x6B65;&#x6280;&#x672F;&#x5C06;&#x65E5;&#x5FD7;&#x5148;&#x6682;&#x5B58;&#x4E0B;&#x6765;&#xFF0C;&#x7136;&#x540E;&#x518D;&#x901A;&#x8FC7;&#x4E00;&#x4E2A;&#x6216;&#x591A;&#x4E2A;&#x4E13;&#x95E8;&#x7684;&#x65E5;&#x5FD7;&#x5199;&#x5165;&#x7EBF;&#x7A0B;&#x53BB;&#x5C06;&#x8FD9;&#x4E9B;&#x7F13;&#x5B58;&#x7684;&#x65E5;&#x5FD7;&#x5199;&#x5165;&#x5230;&#x78C1;&#x76D8;&#x4E2D;&#x53BB;&#xFF0C;&#x8FD9;&#x6837;&#x7684;&#x8BDD;&#xFF0C;&#x539F;&#x6765;&#x8F93;&#x51FA;&#x65E5;&#x5FD7;&#x7684;&#x7EBF;&#x7A0B;&#x5C31;&#x4E0D;&#x5B58;&#x5728;&#x7B49;&#x5F85;&#x5199;&#x65E5;&#x5FD7;&#x5230;&#x78C1;&#x76D8;&#x8FD9;&#x6837;&#x7684;&#x6548;&#x7387;&#x635F;&#x8017;&#x4E86;&#x3002;&#x8FD9;&#x672C;&#x8D28;&#x4E0A;&#xFF0C;&#x5176;&#x5B9E;&#x5C31;&#x662F;&#x4E00;&#x4E2A;&#x751F;&#x4EA7;&#x8005;&#x548C;&#x6D88;&#x8D39;&#x8005;&#xFF0C;&#x4EA7;&#x751F;&#x65E5;&#x5FD7;&#x7684;&#x7EBF;&#x7A0B;&#x662F;&#x751F;&#x4EA7;&#x8005;&#xFF0C;&#x5C06;&#x65E5;&#x5FD7;&#x5199;&#x5165;&#x6587;&#x4EF6;&#x7684;&#x7EBF;&#x7A0B;&#x662F;&#x6D88;&#x8D39;&#x8005;&#x3002;&#x5F53;&#x7136;&#xFF0C;&#x5BF9;&#x4E8E;&#x65E5;&#x5FD7;&#x7684;&#x6D88;&#x8D39;&#x8005;&#x7EBF;&#x7A0B;&#xFF0C;&#x6211;&#x8FD9;&#x91CC;&#x63D0;&#x5230;&#x201C;<strong>&#x4E00;&#x4E2A;</strong>&#x201D;&#x6216;&#x201C;<strong>&#x591A;&#x4E2A;</strong>&#x201D;&#x65E5;&#x5FD7;&#x7EBF;&#x7A0B;&#xFF0C;&#x5728;&#x5B9E;&#x9645;&#x5F00;&#x53D1;&#x4E2D;&#xFF0C;&#x5982;&#x679C;&#x591A;&#x4E2A;&#x65E5;&#x5FD7;&#x6D88;&#x8D39;&#x7EBF;&#x7A0B;&#xFF0C;&#x6211;&#x4EEC;&#x53C8;&#x8981;&#x8003;&#x8651;&#x591A;&#x4E2A;&#x7EBF;&#x7A0B;&#x53EF;&#x80FD;&#x4F1A;&#x9020;&#x6210;&#x5199;&#x65E5;&#x5FD7;&#x7684;&#x65F6;&#x95F4;&#x987A;&#x5E8F;&#x9519;&#x4F4D;&#xFF08;&#x65F6;&#x95F4;&#x8F83;&#x665A;&#x7684;&#x65E5;&#x5FD7;&#x5199;&#x5728;&#x65F6;&#x95F4;&#x8F83;&#x65E9;&#x7684;&#x65E5;&#x5FD7;&#x524D;&#x9762;&#xFF09;&#xFF0C;&#x8FD9;&#x5728;&#x4E0A;&#x6587;&#x4E2D;&#x5DF2;&#x7ECF;&#x8BA8;&#x8BBA;&#x8FC7;&#xFF0C;&#x8FD9;&#x91CC;&#x4E0D;&#x518D;&#x8D58;&#x8FF0;&#x3002;</p>
<p>&#x603B;&#x7ED3;&#x8D77;&#x6765;&#xFF0C;&#x4E3A;&#x4E86;&#x65B9;&#x4FBF;&#x8BFB;&#x8005;&#x7406;&#x89E3;&#x548C;&#x7F16;&#x7801;&#xFF0C;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x8BA4;&#x4E3A;&#x5F02;&#x6B65;&#x5199;&#x65E5;&#x5FD7;&#x7684;&#x903B;&#x8F91;&#x4E00;&#x822C;&#x5B58;&#x5728;&#x4E00;&#x7EC4;&#x4E13;&#x95E8;&#x5199;&#x65E5;&#x5FD7;&#x7684;&#x7EBF;&#x7A0B;&#xFF08;&#x4E00;&#x4E2A;&#x6216;&#x591A;&#x4E2A;&#xFF09;&#xFF0C;&#x7A0B;&#x5E8F;&#x7684;&#x5176;&#x4ED6;&#x7EBF;&#x7A0B;&#x4E3A;&#x8FD9;&#x4E9B;&#x65E5;&#x5FD7;&#x7EBF;&#x7A0B;&#x751F;&#x4EA7;&#x65E5;&#x5FD7;&#x3002;</p>
<p>&#x81F3;&#x4E8E;&#x5176;&#x4ED6;&#x7EBF;&#x7A0B;&#x5982;&#x4F55;&#x5C06;&#x4EA7;&#x751F;&#x7684;&#x65E5;&#x5FD7;&#x4EA4;&#x7ED9;&#x65E5;&#x5FD7;&#x7EBF;&#x7A0B;&#xFF0C;&#x8FD9;&#x5C31;&#x662F;&#x591A;&#x7EBF;&#x7A0B;&#x4E4B;&#x95F4;&#x8D44;&#x6E90;&#x540C;&#x6B65;&#x7684;&#x95EE;&#x9898;&#x4E86;&#x3002;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;&#x4E00;&#x4E2A;&#x961F;&#x5217;&#x6765;&#x5B58;&#x50A8;&#x5176;&#x4ED6;&#x7EBF;&#x7A0B;&#x4EA7;&#x751F;&#x7684;&#x65E5;&#x5FD7;&#xFF0C;&#x65E5;&#x5FD7;&#x7EBF;&#x7A0B;&#x4ECE;&#x8BE5;&#x961F;&#x5217;&#x4E2D;&#x53D6;&#x51FA;&#x65E5;&#x5FD7;&#xFF0C;&#x7136;&#x540E;&#x5C06;&#x65E5;&#x5FD7;&#x5185;&#x5BB9;&#x5199;&#x5165;&#x6587;&#x4EF6;&#x3002;&#x6700;&#x7B80;&#x5355;&#x7684;&#x65B9;&#x5F0F;&#x662F;&#x65E5;&#x5FD7;&#x751F;&#x4EA7;&#x7EBF;&#x7A0B;&#x5C06;&#x6BCF;&#x6B21;&#x4EA7;&#x751F;&#x7684;&#x65E5;&#x5FD7;&#x4FE1;&#x606F;&#x653E;&#x5165;&#x4E00;&#x4E2A;&#x961F;&#x5217;&#x65F6;&#x3001;&#x65E5;&#x5FD7;&#x5199;&#x5165;&#x7EBF;&#x7A0B;&#x4ECE;&#x961F;&#x5217;&#x4E2D;&#x53D6;&#x51FA;&#x65E5;&#x5FD7;&#x65F6;&#xFF0C;&#x90FD;&#x4F7F;&#x7528;&#x4E00;&#x4E2A;<strong>&#x4E92;&#x65A5;&#x4F53;( mutex )</strong>&#x4FDD;&#x62A4;&#x8D77;&#x6765;&#x3002;&#x4EE3;&#x7801;&#x793A;&#x4F8B;&#x5982;&#x4E0B;&#xFF08;C++11 &#x4EE3;&#x7801;&#xFF09;&#xFF1A;</p>
<pre class="language-"><code>/**
 *@desc: AsyncLogger.cpp
 *@author: zhangyl
 *@date: 2018.11.10
 */
#include &quot;stdafx.h&quot;
#include <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>thread</span><span class="token punctuation">&gt;</span></span>
#include <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>mutex</span><span class="token punctuation">&gt;</span></span>
#include <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>list</span><span class="token punctuation">&gt;</span></span>
#include <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>string</span><span class="token punctuation">&gt;</span></span>
#include <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>sstream</span><span class="token punctuation">&gt;</span></span>
#include <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>iostream</span><span class="token punctuation">&gt;</span></span>

//&#x4FDD;&#x62A4;&#x961F;&#x5217;&#x7684;&#x4E92;&#x65A5;&#x4F53;
std::mutex log_mutex;
std::list<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token namespace">std:</span>:string</span><span class="token punctuation">&gt;</span></span> cached_logs;
FILE* log_file = NULL;

bool init_log_file()
{
    //&#x4EE5;&#x8FFD;&#x52A0;&#x5185;&#x5BB9;&#x7684;&#x5F62;&#x5F0F;&#x5199;&#x5165;&#x6587;&#x4EF6;&#x5185;&#x5BB9;&#xFF0C;&#x5982;&#x679C;&#x6587;&#x4EF6;&#x4E0D;&#x5B58;&#x5728;&#xFF0C;&#x5219;&#x521B;&#x5EFA;
    log_file = fopen(&quot;my.log&quot;, &quot;a+&quot;);
    return log_file != NULL;
}

void uninit_log_file()
{
    if (log_file != NULL)
        fclose(log_file);
}

bool write_log_tofile(const std::string&amp; line)
{
    if (log_file == NULL)
        return false;

    if (fwrite((void*)line.c_str(), 1, line.length(), log_file) != line.length())
        return false;

    //&#x5C06;&#x65E5;&#x5FD7;&#x7ACB;&#x5373;&#x51B2;&#x5237;&#x5230;&#x6587;&#x4EF6;&#x4E2D;&#x53BB;
    fflush(log_file);

    return true;
}

void log_producer()
{
    int index = 0;
    while (true)
    {
        ++ index;
        std::ostringstream os;
        os &lt;&lt; &quot;This is log, index: &quot; &lt;&lt; index &lt;&lt; &quot;, producer threadID: &quot; &lt;&lt; std::this_thread::get_id() &lt;&lt; &quot;\n&quot;;
        //&#x4F7F;&#x7528;&#x82B1;&#x62EC;&#x53F7;&#x62EC;&#x8D77;&#x6765;&#x4E3A;&#x7684;&#x662F;&#x51CF;&#x5C0F;&#x9501;&#x7684;&#x7C92;&#x5EA6;
        {
            std::lock_guard<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token namespace">std:</span>:mutex</span><span class="token punctuation">&gt;</span></span> lock(log_mutex);
            cached_logs.emplace_back(os.str());
        }

        std::chrono::milliseconds duration(100);
        std::this_thread::sleep_for(duration);
    }
}

void log_consumer()
{
    std::string line;
    while (true)
    {
        //&#x4F7F;&#x7528;&#x82B1;&#x62EC;&#x53F7;&#x62EC;&#x8D77;&#x6765;&#x4E3A;&#x7684;&#x662F;&#x51CF;&#x5C0F;&#x9501;&#x7684;&#x7C92;&#x5EA6;
        {
            std::lock_guard<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token namespace">std:</span>:mutex</span><span class="token punctuation">&gt;</span></span> lock(log_mutex);
            if (!cached_logs.empty())
            {
                line = cached_logs.front();
                cached_logs.pop_front();
            }
        }

        if (line.empty())
        {        
            std::chrono::milliseconds duration(1000);
            std::this_thread::sleep_for(duration);

            continue;
        }

        write_log_tofile(line);

        line.clear();
    }
}

int main(int argc, char* argv[])
{
    if (!init_log_file())
    {
        std::cout &lt;&lt; &quot;init log file error.&quot; &lt;&lt; std::endl;
        return -1;
    }

    std::thread log_producer1(log_producer);
    std::thread log_producer2(log_producer);
    std::thread log_producer3(log_producer);

    std::thread log_consumer1(log_consumer);
    std::thread log_consumer2(log_consumer);
    std::thread log_consumer3(log_consumer);

    log_producer1.join();
    log_producer2.join();
    log_producer3.join();

    log_consumer1.join();
    log_consumer2.join();
    log_consumer3.join();

    uninit_log_file();

    return 0;
}
</code></pre><p>&#x4E0A;&#x8FF0;&#x4EE3;&#x7801;&#x5206;&#x522B;&#x6A21;&#x62DF;&#x4E86;&#x4E09;&#x4E2A;&#x751F;&#x4EA7;&#x65E5;&#x5FD7;&#x7684;&#x7EBF;&#x7A0B;&#xFF08;<strong>log_producer1&#xFF5E;3</strong>&#xFF09;&#x548C;&#x4E09;&#x4E2A;&#x6D88;&#x8D39;&#x65E5;&#x5FD7;&#x7EBF;&#x7A0B;&#xFF08;<strong>log_consumer1&#xFF5E;3</strong>&#xFF09;&#x3002;&#x5F53;&#x7136;&#x4E0A;&#x8FF0;&#x4EE3;&#x7801;&#x53EF;&#x4EE5;&#x7EE7;&#x7EED;&#x4F18;&#x5316;&#xFF0C;&#x5982;&#x679C;&#x5F53;&#x524D;&#x7F13;&#x5B58;&#x961F;&#x5217;&#x4E2D;&#x6CA1;&#x6709;&#x65E5;&#x5FD7;&#x8BB0;&#x5F55;&#xFF0C;&#x90A3;&#x4E48;&#x6D88;&#x8D39;&#x65E5;&#x5FD7;&#x7EBF;&#x7A0B;&#x4F1A;&#x505A;&#x65E0;&#x7528;&#x529F;&#x3002;</p>
<h5 id="&#x4F18;&#x5316;&#x65B9;&#x6CD5;&#x4E00;"><a name="&#x4F18;&#x5316;&#x65B9;&#x6CD5;&#x4E00;" class="anchor-navigation-ex-anchor" href="#&#x4F18;&#x5316;&#x65B9;&#x6CD5;&#x4E00;"><i class="fa fa-link" aria-hidden="true"></i></a>&#x4F18;&#x5316;&#x65B9;&#x6CD5;&#x4E00;</h5>
<p>&#x53EF;&#x4EE5;&#x4F7F;&#x7528;&#x6761;&#x4EF6;&#x53D8;&#x91CF;&#xFF0C;&#x5982;&#x679C;&#x5F53;&#x524D;&#x961F;&#x5217;&#x4E2D;&#x6CA1;&#x6709;&#x65E5;&#x5FD7;&#x8BB0;&#x5F55;&#xFF0C;&#x5219;&#x5C06;&#x65E5;&#x5FD7;&#x6D88;&#x8D39;&#x7EBF;&#x7A0B;&#x6302;&#x8D77;&#xFF1B;&#x5F53;&#x751F;&#x4EA7;&#x65E5;&#x5FD7;&#x7684;&#x7EBF;&#x7A0B;&#x4EA7;&#x751F;&#x4E86;&#x65B0;&#x7684;&#x65E5;&#x5FD7;&#x540E;&#xFF0C;<strong>&#x7F6E;&#x4FE1;&#xFF08;signal&#xFF09;</strong>&#x6761;&#x4EF6;&#x53D8;&#x91CF;&#xFF0C;&#x8FD9;&#x6837;&#x65E5;&#x5FD7;&#x6D88;&#x8D39;&#x7EBF;&#x7A0B;&#x4F1A;&#x88AB;&#x5524;&#x9192;&#xFF0C;&#x4EE5;&#x5C06;&#x65E5;&#x5FD7;&#x4ECE;&#x961F;&#x5217;&#x4E2D;&#x53D6;&#x51FA;&#x6765;&#x5E76;&#x5199;&#x5165;&#x6587;&#x4EF6;&#x3002;&#x6211;&#x4EEC;&#x6765;&#x770B;&#x4E0B;&#x4EE3;&#x7801;&#xFF1A;</p>
<pre class="language-"><code>/**
 *@desc: AsyncLoggerLinux.cpp
 *@author: zhangyl
 *@date: 2018.11.10
 */
#include &quot;stdafx.h&quot;
#include <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>thread</span><span class="token punctuation">&gt;</span></span>
#include <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>mutex</span><span class="token punctuation">&gt;</span></span>
#include <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>condition_variable</span><span class="token punctuation">&gt;</span></span>
#include <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>list</span><span class="token punctuation">&gt;</span></span>
#include <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>string</span><span class="token punctuation">&gt;</span></span>
#include <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>sstream</span><span class="token punctuation">&gt;</span></span>
#include <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>iostream</span><span class="token punctuation">&gt;</span></span>

std::mutex log_mutex;
std::condition_variable log_cv;
std::list<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token namespace">std:</span>:string</span><span class="token punctuation">&gt;</span></span> cached_logs;
FILE* log_file = NULL;

bool init_log_file()
{
    //&#x4EE5;&#x8FFD;&#x52A0;&#x5185;&#x5BB9;&#x7684;&#x5F62;&#x5F0F;&#x5199;&#x5165;&#x6587;&#x4EF6;&#x5185;&#x5BB9;&#xFF0C;&#x5982;&#x679C;&#x6587;&#x4EF6;&#x4E0D;&#x5B58;&#x5728;&#xFF0C;&#x5219;&#x521B;&#x5EFA;
    log_file = fopen(&quot;my.log&quot;, &quot;a+&quot;);
    return log_file != NULL;
}

void uninit_log_file()
{
    if (log_file != NULL)
        fclose(log_file);
}

bool write_log_tofile(const std::string&amp; line)
{
    if (log_file == NULL)
        return false;

    if (fwrite((void*)line.c_str(), 1, line.length(), log_file) != line.length())
        return false;

    //&#x5C06;&#x65E5;&#x5FD7;&#x7ACB;&#x5373;&#x51B2;&#x5237;&#x5230;&#x6587;&#x4EF6;&#x4E2D;&#x53BB;
    fflush(log_file);

    return true;
}

void log_producer()
{
    int index = 0;
    while (true)
    {
        ++ index;
        std::ostringstream os;
        os &lt;&lt; &quot;This is log, index: &quot; &lt;&lt; index &lt;&lt; &quot;, producer threadID: &quot; &lt;&lt; std::this_thread::get_id() &lt;&lt; &quot;\n&quot;;
        //&#x4F7F;&#x7528;&#x82B1;&#x62EC;&#x53F7;&#x62EC;&#x8D77;&#x6765;&#x4E3A;&#x7684;&#x662F;&#x51CF;&#x5C0F;&#x9501;&#x7684;&#x7C92;&#x5EA6;
        {
            std::lock_guard<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token namespace">std:</span>:mutex</span><span class="token punctuation">&gt;</span></span> lock(log_mutex);
            cached_logs.emplace_back(os.str());
            log_cv.notify_one();
        }

        std::chrono::milliseconds duration(100);
        std::this_thread::sleep_for(duration);
    }
}

void log_consumer()
{
    std::string line;
    while (true)
    {
        //&#x4F7F;&#x7528;&#x82B1;&#x62EC;&#x53F7;&#x62EC;&#x8D77;&#x6765;&#x4E3A;&#x7684;&#x662F;&#x51CF;&#x5C0F;&#x9501;&#x7684;&#x7C92;&#x5EA6;
        {
            std::unique_lock<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token namespace">std:</span>:mutex</span><span class="token punctuation">&gt;</span></span> lock(log_mutex);
            if (cached_logs.empty())
            {
                //&#x65E0;&#x9650;&#x7B49;&#x5F85;
                log_cv.wait(lock);
            }

            line = cached_logs.front();
            cached_logs.pop_front();
        }

        if (line.empty())
        {        
            std::chrono::milliseconds duration(1000);
            std::this_thread::sleep_for(duration);

            continue;
        }

        write_log_tofile(line);

        line.clear();
    }
}

int main(int argc, char* argv[])
{
    if (!init_log_file())
    {
        std::cout &lt;&lt; &quot;init log file error.&quot; &lt;&lt; std::endl;
        return -1;
    }

    std::thread log_producer1(log_producer);
    std::thread log_producer2(log_producer);
    std::thread log_producer3(log_producer);

    std::thread log_consumer1(log_consumer);
    std::thread log_consumer2(log_consumer);
    std::thread log_consumer3(log_consumer);

    log_producer1.join();
    log_producer2.join();
    log_producer3.join();

    log_consumer1.join();
    log_consumer2.join();
    log_consumer3.join();

    uninit_log_file();

    return 0;
}
</code></pre><h5 id="&#x4F18;&#x5316;&#x65B9;&#x6CD5;&#x4E8C;"><a name="&#x4F18;&#x5316;&#x65B9;&#x6CD5;&#x4E8C;" class="anchor-navigation-ex-anchor" href="#&#x4F18;&#x5316;&#x65B9;&#x6CD5;&#x4E8C;"><i class="fa fa-link" aria-hidden="true"></i></a>&#x4F18;&#x5316;&#x65B9;&#x6CD5;&#x4E8C;</h5>
<p>&#x9664;&#x4E86;&#x6761;&#x4EF6;&#x53D8;&#x91CF;&#x4EE5;&#x5916;&#xFF0C;&#x6211;&#x4EEC;&#x8FD8;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;&#x4FE1;&#x53F7;&#x91CF;&#x6765;&#x8BBE;&#x8BA1;&#x6211;&#x4EEC;&#x7684;&#x5F02;&#x6B65;&#x65E5;&#x5FD7;&#x7CFB;&#x7EDF;&#xFF0C;&#x4FE1;&#x53F7;&#x91CF;&#x662F;&#x5E26;&#x6709;&#x8D44;&#x6E90;&#x8BA1;&#x6570;&#x7684;&#x7EBF;&#x7A0B;&#x540C;&#x6B65;&#x5BF9;&#x8C61;&#xFF0C;&#x5F53;&#x6BCF;&#x4EA7;&#x751F;&#x4E00;&#x6761;&#x65E5;&#x5FD7;&#x65F6;&#xFF0C;&#x6211;&#x4EEC;&#x5C06;&#x4FE1;&#x53F7;&#x91CF;&#x8D44;&#x6E90;&#x8BA1;&#x6570;&#x81EA;&#x589E;1&#xFF0C;&#x65E5;&#x5FD7;&#x6D88;&#x8D39;&#x7EBF;&#x7A0B;&#x9ED8;&#x8BA4;&#x662F;&#x7B49;&#x5F85;&#x8FD9;&#x4E2A;&#x4FE1;&#x53F7;&#x91CF;&#x662F;&#x5426;&#x53D7;&#x4FE1;&#xFF0C;&#x5982;&#x679C;&#x53D7;&#x4FE1;&#xFF0C;&#x6BCF;&#x5524;&#x9192;&#x4E00;&#x4E2A;&#x65E5;&#x5FD7;&#x6D88;&#x8D39;&#x7EBF;&#x7A0B;&#xFF0C;&#x4FE1;&#x53F7;&#x91CF;&#x5B57;&#x6570;&#x8BA1;&#x6570;&#x5C06;&#x81EA;&#x52A8;&#x51CF;1&#x3002;&#x901A;&#x4FD7;&#x5730;&#x8BF4;&#x5C31;&#x662F;&#x751F;&#x6210;&#x8005;&#x6BCF;&#x751F;&#x4EA7;&#x4E00;&#x4E2A;&#x8D44;&#x6E90;&#xFF0C;&#x5C31;&#x5C06;&#x8D44;&#x6E90;&#x8BA1;&#x6570;&#x52A0;1&#xFF0C;&#x800C;&#x6D88;&#x8D39;&#x8005;&#x6BCF;&#x6D88;&#x8D39;&#x4E00;&#x4E2A;&#x8D44;&#x6E90;&#x6570;&#x91CF;&#xFF0C;&#x5C31;&#x5C06;&#x8D44;&#x6E90;&#x8BA1;&#x6570;&#x51CF;&#x4E00;&#xFF1B;&#x5982;&#x679C;&#x5F53;&#x524D;&#x8D44;&#x6E90;&#x8BA1;&#x6570;&#x5DF2;&#x7ECF;&#x4E3A;0&#xFF0C;&#x5219;&#x6D88;&#x8D39;&#x8005;&#x5C06;&#x81EA;&#x52A8;&#x6302;&#x8D77;&#x3002;</p>
<p>&#x7531;&#x4E8E; C++ 11 &#x6CA1;&#x6709;&#x63D0;&#x4F9B;&#x5BF9;&#x4E0D;&#x540C;&#x5E73;&#x53F0;&#x7684;&#x4FE1;&#x53F7;&#x91CF;&#x5BF9;&#x8C61;&#x7684;&#x5C01;&#x88C5;&#xFF0C;&#x6211;&#x4EEC;&#x8FD9;&#x91CC;&#x5206;&#x522B;&#x7ED9;&#x51FA; Windows &#x548C; Linux &#x4E24;&#x4E2A;&#x5E73;&#x53F0;&#x7684;&#x5B9E;&#x73B0;&#x4EE3;&#x7801;&#xFF0C;&#x8BFB;&#x8005;&#x53EF;&#x4EE5;&#x6839;&#x636E;&#x9700;&#x8981;&#x6765;&#x5B66;&#x4E60;&#x5176;&#x4E2D;&#x4E00;&#x4E2A;&#x6216;&#x4E24;&#x4E2A;&#x540C;&#x65F6;&#x5B66;&#x4E60;&#x3002;&#x6CE8;&#x610F;&#xFF0C;&#x4E3A;&#x4E86;&#x4FDD;&#x6301;&#x4EE3;&#x7801;&#x98CE;&#x683C;&#x4E00;&#x81F4;&#xFF0C;&#x5BF9;&#x4E8E;&#x7EBF;&#x7A0B;&#x548C;&#x8BFB;&#x5199;&#x6587;&#x4EF6;&#x76F8;&#x5173;&#x51FD;&#x6570;&#xFF0C;&#x5728;&#x4E0D;&#x540C;&#x7684;&#x64CD;&#x4F5C;&#x7CFB;&#x7EDF;&#x5E73;&#x53F0;&#xFF0C;&#x6211;&#x4EEC;&#x4F7F;&#x7528;&#x8BE5;&#x7CFB;&#x7EDF;&#x5E73;&#x53F0;&#x76F8;&#x5173;&#x7684; API &#x63A5;&#x53E3;&#xFF0C;&#x800C;&#x4E0D;&#x518D;&#x4F7F;&#x7528; C++ 11 &#x7684;&#x76F8;&#x5173;&#x51FD;&#x6570;&#x548C;&#x7C7B;&#x5E93;&#x3002;</p>
<p><strong>Windows &#x5E73;&#x53F0;&#x4EE3;&#x7801;</strong></p>
<pre class="language-"><code>/**
 *@desc: AsyncLogger.cpp&#xFF0C;Windows&#x7248;&#x672C;
 *@author: zhangyl
 *@date: 2018.11.10
 */
#include &quot;stdafx.h&quot;
#include <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>windows.h</span><span class="token punctuation">&gt;</span></span>
#include <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>list</span><span class="token punctuation">&gt;</span></span>
#include <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>string</span><span class="token punctuation">&gt;</span></span>
#include <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>iostream</span><span class="token punctuation">&gt;</span></span>
#include <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>sstream</span><span class="token punctuation">&gt;</span></span>

std::list<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token namespace">std:</span>:string</span><span class="token punctuation">&gt;</span></span> cached_logs;
CRITICAL_SECTION g_cs;
HANDLE g_hSemaphore = NULL;
HANDLE g_hLogFile = INVALID_HANDLE_VALUE;

bool Init()
{
    InitializeCriticalSection(&amp;g_cs);

    //&#x5047;&#x8BBE;&#x8D44;&#x6E90;&#x6570;&#x91CF;&#x4E0A;&#x9650;&#x662F;0xFFFFFFFF
    g_hSemaphore = CreateSemaphore(NULL, 0, 0xFFFFFFFF, NULL);

    //&#x5982;&#x679C;&#x6587;&#x4EF6;&#x4E0D;&#x5B58;&#x5728;&#xFF0C;&#x5219;&#x521B;&#x5EFA;
    g_hLogFile = CreateFile(_T(&quot;my.log&quot;), GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    if (g_hLogFile == INVALID_HANDLE_VALUE)
        return false;

    return true;
}

void Uninit()
{
    DeleteCriticalSection(&amp;g_cs);

    if (g_hSemaphore != NULL)
        CloseHandle(g_hSemaphore);

    if (g_hLogFile != INVALID_HANDLE_VALUE)
        CloseHandle(g_hLogFile);
}

bool WriteLogToFile(const std::string&amp; line)
{
    if (g_hLogFile == INVALID_HANDLE_VALUE)
        return false;

    DWORD dwBytesWritten;
    //&#x5982;&#x679C;&#x5BF9;&#x4E8E;&#x6BD4;&#x8F83;&#x957F;&#x7684;&#x65E5;&#x5FD7;&#xFF0C;&#x5E94;&#x8BE5;&#x5206;&#x6BB5;&#x5199;&#x5165;&#xFF0C;&#x56E0;&#x4E3A;&#x5355;&#x6B21;&#x5199;&#x5165;&#x53EF;&#x80FD;&#x53EA;&#x80FD;&#x5199;&#x5165;&#x90E8;&#x5206;&#xFF0C;&#x8FD9;&#x91CC;&#x4E3A;&#x4E86;&#x6F14;&#x793A;&#x65B9;&#x4FBF;&#xFF0C;&#x903B;&#x8F91;&#x4ECE;&#x7B80;
    if (!WriteFile(g_hLogFile, line.c_str(), line.length(), &amp;dwBytesWritten, NULL) || dwBytesWritten != line.length())
        return false;

    //&#x5C06;&#x65E5;&#x5FD7;&#x7ACB;&#x5373;&#x51B2;&#x5237;&#x5230;&#x6587;&#x4EF6;&#x4E2D;&#x53BB;
    FlushFileBuffers(g_hLogFile);

    return true;
}

DWORD CALLBACK LogProduceThreadProc(LPVOID lpThreadParameter)
{
    int index = 0;
    while (true)
    {
        ++ index;
        std::ostringstream os;
        os &lt;&lt; &quot;This is log, index: &quot; &lt;&lt; index &lt;&lt; &quot;, producer threadID: &quot; &lt;&lt; GetCurrentThreadId() &lt;&lt; &quot;\n&quot;;

        EnterCriticalSection(&amp;g_cs);       
        cached_logs.emplace_back(os.str());
        LeaveCriticalSection(&amp;g_cs);

        ReleaseSemaphore(g_hSemaphore, 1, NULL);

        Sleep(100);
    }

    return 0;
}

DWORD CALLBACK LogConsumeThreadProc(LPVOID lpThreadParameter)
{
    std::string line;
    while (true)
    {     
        //&#x65E0;&#x9650;&#x7B49;&#x5F85;
        WaitForSingleObject(g_hSemaphore, INFINITE);

        EnterCriticalSection(&amp;g_cs);
        if (!cached_logs.empty())
        {
            line = cached_logs.front();
            cached_logs.pop_front();
        }     
        LeaveCriticalSection(&amp;g_cs);          

        if (line.empty())
        {        
            Sleep(1000);

            continue;
        }

        WriteLogToFile(line);

        line.clear();
    }
}

int main(int argc, char* argv[])
{
    if (!Init())
    {
        std::cout &lt;&lt; &quot;init log file error.&quot; &lt;&lt; std::endl;
        return -1;
    }

    HANDLE hProducers[3];
    for (int i = 0; i &lt; sizeof(hProducers) / sizeof(hProducers[0]); ++i)
    {
        hProducers[i] = CreateThread(NULL, 0, LogProduceThreadProc, NULL, 0, NULL);
    }

    HANDLE hConsumers[3];
    for (int i = 0; i &lt; sizeof(hConsumers) / sizeof(hConsumers[0]); ++i)
    {
        hConsumers[i] = CreateThread(NULL, 0, LogConsumeThreadProc, NULL, 0, NULL);
    }

    //&#x7B49;&#x5F85;&#x6D88;&#x8D39;&#x8005;&#x7EBF;&#x7A0B;&#x9000;&#x51FA;
    for (int i = 0; i &lt; sizeof(hProducers) / sizeof(hProducers[0]); ++i)
    {
        WaitForSingleObject(hProducers[i], INFINITE);
    }

    //&#x7B49;&#x5F85;&#x751F;&#x4EA7;&#x8005;&#x7EBF;&#x7A0B;&#x9000;&#x51FA;
    for (int i = 0; i &lt; sizeof(hConsumers) / sizeof(hConsumers[0]); ++i)
    {
        WaitForSingleObject(hConsumers[i], INFINITE);
    }

    Uninit();

    return 0;
}
</code></pre><p>&#x4E0A;&#x8FF0;&#x4EE3;&#x7801;&#xFF0C;&#x5728;&#x591A;&#x7EBF;&#x7A0B;&#x5411;&#x961F;&#x5217;&#x4E2D;&#x589E;&#x52A0;&#x65E5;&#x5FD7;&#x8BB0;&#x5F55;&#x548C;&#x4ECE;&#x961F;&#x5217;&#x4E2D;&#x53D6;&#x51FA;&#x65E5;&#x5FD7;&#x8BB0;&#x5F55;&#x4F7F;&#x7528;&#x4E86;Windows&#x7684;&#x4E0A;&#x7684;<strong>&#x4E34;&#x754C;&#x533A;&#xFF08;CRITICAL_SECTION&#xFF0C;&#x6709;&#x7684;&#x4E66;&#x4E0A;&#x8BD1;&#x4F5C;&#x201C;&#x5173;&#x952E;&#x6BB5;&#x201D;&#xFF09;</strong>&#x5BF9;&#x8C61;&#x6765;&#x5BF9;&#x961F;&#x5217;&#x8FDB;&#x884C;&#x4FDD;&#x62A4;&#x3002;</p>
<p><strong>Linux &#x5E73;&#x53F0;&#x4EE3;&#x7801;</strong></p>
<pre class="language-"><code>/**
 *@desc: AsyncLogger.cpp&#xFF0C;linux&#x7248;&#x672C;
 *@author: zhangyl
 *@date: 2018.11.10
 */
#include <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>unistd.h</span><span class="token punctuation">&gt;</span></span>
#include <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>list</span><span class="token punctuation">&gt;</span></span>
#include <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>stdio.h</span><span class="token punctuation">&gt;</span></span>
#include <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>pthread.h</span><span class="token punctuation">&gt;</span></span>
#include <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>semaphore.h</span><span class="token punctuation">&gt;</span></span>
#include <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>string</span><span class="token punctuation">&gt;</span></span>
#include <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>iostream</span><span class="token punctuation">&gt;</span></span>
#include <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>sstream</span><span class="token punctuation">&gt;</span></span>


std::list<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token namespace">std:</span>:string</span><span class="token punctuation">&gt;</span></span> cached_logs;
pthread_mutex_t log_mutex = PTHREAD_MUTEX_INITIALIZER;
sem_t           log_semphore;
FILE* plogfile = NULL;

bool init()
{
    pthread_mutex_init(&amp;log_mutex, NULL);
    //&#x521D;&#x59CB;&#x4FE1;&#x53F7;&#x91CF;&#x8D44;&#x6E90;&#x6570;&#x76EE;&#x662F;0
    sem_init(&amp;log_semphore, 0, 0);

    //&#x5982;&#x679C;&#x6587;&#x4EF6;&#x4E0D;&#x5B58;&#x5728;&#xFF0C;&#x5219;&#x521B;&#x5EFA;
    plogfile = fopen(&quot;my.log&quot;, &quot;a++&quot;);

    return plogfile != NULL;
}

void uninit()
{
    pthread_mutex_destroy(&amp;log_mutex);
    sem_destroy(&amp;log_semphore);

    if (plogfile != NULL)
        fclose(plogfile);
}

bool write_log_to_file(const std::string&amp; line)
{
    if (plogfile == NULL)
        return false;

    //&#x5982;&#x679C;&#x5BF9;&#x4E8E;&#x6BD4;&#x8F83;&#x957F;&#x7684;&#x65E5;&#x5FD7;&#xFF0C;&#x5E94;&#x8BE5;&#x5206;&#x6BB5;&#x5199;&#x5165;&#xFF0C;&#x56E0;&#x4E3A;&#x5355;&#x6B21;&#x5199;&#x5165;&#x53EF;&#x80FD;&#x53EA;&#x80FD;&#x5199;&#x5165;&#x90E8;&#x5206;&#xFF0C;&#x8FD9;&#x91CC;&#x4E3A;&#x4E86;&#x6F14;&#x793A;&#x65B9;&#x4FBF;&#xFF0C;&#x903B;&#x8F91;&#x4ECE;&#x7B80;
    if (fwrite((void*)line.c_str(), 1, line.length(), plogfile) != line.length())
        return false;

    //&#x5C06;&#x65E5;&#x5FD7;&#x7ACB;&#x5373;&#x51B2;&#x5237;&#x5230;&#x6587;&#x4EF6;&#x4E2D;&#x53BB;
    fflush(plogfile);

    return true;
}

void* producer_thread_proc(void* arg)
{
    int index = 0;
    while (true)
    {
        ++ index;
        std::ostringstream os;
        os &lt;&lt; &quot;This is log, index: &quot; &lt;&lt; index &lt;&lt; &quot;, producer threadID: &quot; &lt;&lt; pthread_self() &lt;&lt; &quot;\n&quot;;

        pthread_mutex_lock(&amp;log_mutex);
        cached_logs.push_back(os.str());
        pthread_mutex_unlock(&amp;log_mutex);

        sem_post(&amp;log_semphore);

        usleep(100000);
    }
}

void* consumer_thread_proc(void* arg)
{
    std::string line;
    while (true)
    {     
        //&#x65E0;&#x9650;&#x7B49;&#x5F85;
        sem_wait(&amp;log_semphore);

        pthread_mutex_lock(&amp;log_mutex);
        if (!cached_logs.empty())
        {
            line = cached_logs.front();
            cached_logs.pop_front();
        }     
        pthread_mutex_unlock(&amp;log_mutex);

        if (line.empty())
        {        
            sleep(1);

            continue;
        }

        write_log_to_file(line);

        line.clear();
    }
}

int main(int argc, char* argv[])
{
    if (!init())
    {
        std::cout &lt;&lt; &quot;init log file error.&quot; &lt;&lt; std::endl;
        return -1;
    }

    pthread_t producer_thread_id[3];
    for (int i = 0; i &lt; sizeof(producer_thread_id) / sizeof(producer_thread_id[0]); ++i)
    {
        pthread_create(&amp;producer_thread_id[i], NULL, producer_thread_proc, NULL);
    }

    pthread_t consumer_thread_id[3];
    for (int i = 0; i &lt; sizeof(consumer_thread_id) / sizeof(consumer_thread_id[0]); ++i)
    {
        pthread_create(&amp;consumer_thread_id[i], NULL, consumer_thread_proc, NULL);
    }

    //&#x7B49;&#x5F85;&#x6D88;&#x8D39;&#x8005;&#x7EBF;&#x7A0B;&#x9000;&#x51FA;
    for (int i = 0; i &lt; sizeof(producer_thread_id) / sizeof(producer_thread_id[0]); ++i)
    {
        pthread_join(producer_thread_id[i], NULL);
    }

    //&#x7B49;&#x5F85;&#x751F;&#x4EA7;&#x8005;&#x7EBF;&#x7A0B;&#x9000;&#x51FA;
    for (int i = 0; i &lt; sizeof(consumer_thread_id) / sizeof(consumer_thread_id[0]); ++i)
    {
        pthread_join(consumer_thread_id[i], NULL);
    }

    uninit();

    return 0;
}
</code></pre><p>&#x6211;&#x4EEC;&#x4F7F;&#x7528; g++ &#x7F16;&#x8BD1;&#x5668;&#x7F16;&#x8BD1;&#x4E0A;&#x8FF0;&#x4EE3;&#x7801;&#xFF0C;&#x4F7F;&#x7528;&#x5982;&#x4E0B;&#x547D;&#x4EE4;&#x751F;&#x6210;&#x53EF;&#x79FB;&#x690D;&#x6027;&#x6587;&#x4EF6; <strong>AsyncLoggerLinux</strong>&#xFF1A;</p>
<pre class="language-"><code>g++ -g -o AsyncLoggerLinux AsyncLoggerLinux.cpp -lpthread
</code></pre><p>&#x63A5;&#x7740;&#x6267;&#x884C;&#x751F;&#x6210;&#x7684; <strong>AsyncLoggerLinux</strong> &#x6587;&#x4EF6;&#xFF0C;&#x7136;&#x540E;&#x751F;&#x6210;&#x7684;&#x65E5;&#x5FD7;&#x6548;&#x679C;&#x5982;&#x4E0B;&#xFF1A;</p>
<pre class="language-"><code>This is log, index: 1, producer threadID: 140512358795008
This is log, index: 1, producer threadID: 140512367187712
This is log, index: 1, producer threadID: 140512375580416
This is log, index: 2, producer threadID: 140512358795008
This is log, index: 2, producer threadID: 140512367187712
This is log, index: 2, producer threadID: 140512375580416
This is log, index: 3, producer threadID: 140512358795008
This is log, index: 3, producer threadID: 140512367187712
This is log, index: 3, producer threadID: 140512375580416
This is log, index: 4, producer threadID: 140512358795008
This is log, index: 4, producer threadID: 140512367187712
This is log, index: 4, producer threadID: 140512375580416
This is log, index: 5, producer threadID: 140512358795008
This is log, index: 5, producer threadID: 140512367187712
This is log, index: 5, producer threadID: 140512375580416
//&#x7701;&#x7565;...
</code></pre><blockquote>
<p>&#x5F53;&#x7136;&#xFF0C;&#x60A8;&#x53EF;&#x80FD;&#x9700;&#x8981;&#x540C;&#x65F6;&#x80FD;&#x5728; Windows &#x548C; Linux &#x540C;&#x65F6;&#x8FD0;&#x884C;&#x7684;&#x4EE3;&#x7801;&#xFF0C;&#x6211;&#x4EEC;&#x81EA;&#x7136;&#x800C;&#x7136;&#x60F3;&#x5230;&#x7528; C++11 &#x8BED;&#x6CD5;&#x7684;&#x4FE1;&#x53F7;&#x91CF;&#xFF0C;&#x7531;&#x4E8E; C++ 11 &#x672C;&#x8EAB;&#x6CA1;&#x6709;&#x63D0;&#x4F9B;&#x73B0;&#x6210;&#x7684;&#x4FE1;&#x53F7;&#x91CF;&#x5E93;&#xFF0C;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x81EA;&#x5DF1;&#x5229;&#x7528;<strong>std::mutex</strong>&#x3001;<strong>std::condition_variable</strong>&#x6A21;&#x62DF;&#x4E00;&#x4E0B;&#x4FE1;&#x53F7;&#x91CF;&#x7684;&#x529F;&#x80FD;&#xFF0C;&#x8FD9;&#x91CC;&#x5C31;&#x4E0D;&#x518D;&#x8BE6;&#x7EC6;&#x4ECB;&#x7ECD;&#x4E86;&#xFF0C;&#x6709;&#x5174;&#x8DA3;&#x7684;&#x53EF;&#x4EE5;&#x81EA;&#x884C;&#x5C1D;&#x8BD5;&#x4E00;&#x4E0B;&#x3002;</p>
</blockquote>
<p>&#x4EE5;&#x4E0A;&#x5C31;&#x662F;&#x5F02;&#x6B65;&#x65E5;&#x5FD7;&#x7684;&#x57FA;&#x672C;&#x539F;&#x7406;&#xFF0C;&#x5728;&#x8FD9;&#x4E2A;&#x539F;&#x7406;&#x7684;&#x57FA;&#x7840;&#x4E0A;&#xFF0C;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x589E;&#x52A0;&#x5F88;&#x591A;&#x7684;&#x7279;&#x6027;&#x3002;</p>
<footer class="page-footer"><span class="copyright">&#x5982;&#x9700;&#x4E0B;&#x8F7D;&#x672C;&#x7AD9;&#x5168;&#x90E8;&#x6280;&#x672F;&#x6587;&#x7AE0;&#xFF0C;&#x53EF;&#x4EE5;&#x5728;&#x3010;&#x9AD8;&#x6027;&#x80FD;&#x670D;&#x52A1;&#x5668;&#x5F00;&#x53D1;&#x3011;&#x516C;&#x4F17;&#x53F7;&#x56DE;&#x590D;&#x5173;&#x952E;&#x5B57;&#x201C;&#x6587;&#x7AE0;&#x4E0B;&#x8F7D;&#x201D;&#x5373;&#x53EF;&#x3002;</span><span class="footer-modification">&#x6700;&#x8FD1;&#x66F4;&#x65B0;&#x65F6;&#x95F4;&#xFF1A;
2020-10-09 23:36:09
</span></footer>
<script>console.log("plugin-popup....");document.onclick = function(e){ e.target.tagName === "IMG" && window.open(e.target.src,e.target.src)}</script><style>img{cursor:pointer}</style>
						
					</section>
					
    </div>
    <div class="search-results">
        <div class="has-results">
            
            <h1 class="search-results-title"><span class='search-results-count'></span> results matching "<span class='search-query'></span>"</h1>
            <ul class="search-results-list"></ul>
            
        </div>
        <div class="no-results">
            
            <h1 class="search-results-title">No results matching "<span class='search-query'></span>"</h1>
            
        </div>
    </div>
</div>

				</div>
			</div>
			
		</div>

		
		
		<a href="错误码系统的设计.html" class="navigation navigation-prev " aria-label="Previous page: 错误码系统的设计">
			<i class="fa fa-angle-left"></i>
		</a>
		
		
		<a href="如何设计断线自动重连机制.html" class="navigation navigation-next " aria-label="Next page: 如何设计断线自动重连机制">
			<i class="fa fa-angle-right"></i>
		</a>
		
		
		
	</div>
	<script>
		var gitbook = gitbook || [];
		gitbook.push(function() {
			gitbook.page.hasChanged({"page":{"title":"日志系统的设计","level":"4.1.5","depth":2,"next":{"title":"如何设计断线自动重连机制","level":"4.1.6","depth":2,"path":"articles/高性能服务器框架设计/如何设计断线自动重连机制.md","ref":"articles/高性能服务器框架设计/如何设计断线自动重连机制.md","articles":[]},"previous":{"title":"错误码系统的设计","level":"4.1.4","depth":2,"path":"articles/高性能服务器框架设计/错误码系统的设计.md","ref":"articles/高性能服务器框架设计/错误码系统的设计.md","articles":[]},"dir":"ltr"},"config":{"plugins":["chapter-fold","-lunr","-search","search-pro","splitter","popup","back-to-top-button","hide-element","prism","-highlight","tbfed-pagefooter","code","anchor-navigation-ex","theme-fexa","livereload"],"styles":{"website":"styles/website.css","pdf":"styles/pdf.css","epub":"styles/epub.css","mobi":"styles/mobi.css","ebook":"styles/ebook.css","print":"styles/print.css"},"pluginsConfig":{"tbfed-pagefooter":{"copyright":"如需下载本站全部技术文章，可以在【高性能服务器开发】公众号回复关键字“文章下载”即可。","modify_label":"最近更新时间：","modify_format":"YYYY-MM-DD HH:mm:ss"},"chapter-fold":{},"prism":{},"livereload":{},"splitter":{},"search-pro":{},"popup":{},"theme-fexa":{"search-placeholder":"输入关键字搜索","logo":"./logo.png","favicon":"./favicon.ico"},"code":{"copyButtons":true},"hide-element":{"elements":[".gitbook-link"]},"fontsettings":{"theme":"white","family":"sans","size":2},"anchor-navigation-ex":{"showLevel":false,"associatedWithSummary":true,"mode":"float","showGoTop":false,"printLog":false,"multipleH1":true,"float":{"floatIcon":"fa fa-navicon","showLevelIcon":false,"level1Icon":"","level2Icon":"","level3Icon":""},"pageTop":{"showLevelIcon":false,"level1Icon":"","level2Icon":"","level3Icon":""}},"back-to-top-button":{},"sharing":{"facebook":true,"twitter":true,"google":false,"weibo":false,"instapaper":false,"vk":false,"all":["facebook","google","twitter","weibo","instapaper"]},"theme-default":{"styles":{"website":"styles/website.css","pdf":"styles/pdf.css","epub":"styles/epub.css","mobi":"styles/mobi.css","ebook":"styles/ebook.css","print":"styles/print.css"},"showLevel":false}},"theme":"default","author":"easy_coder","pdf":{"pageBreaksBefore":"/","headerTemplate":null,"paperSize":"a4","margin":{"right":62,"left":62,"top":36,"bottom":36},"fontSize":12,"fontFamily":"Arial","footerTemplate":null,"chapterMark":"pagebreak","pageNumbers":false},"structure":{"langs":"LANGS.md","readme":"README.md","glossary":"GLOSSARY.md","summary":"SUMMARY.md"},"isbn":"","variables":{},"title":"高性能服务器开发 技术专栏","links":{},"gitbook":"*","description":"","theme-default":{"showLevel":true},"extension":null},"file":{"path":"articles/高性能服务器框架设计/日志系统的设计.md","mtime":"2020-10-09T15:36:09.539Z","type":"markdown"},"gitbook":{"version":"3.2.3","time":"2020-10-09T15:31:57.905Z"},"basePath":"../..","book":{"language":""}});
		});
	</script>
</div>

        
    <script src="../../gitbook/gitbook.js"></script>
    <script src="../../gitbook/theme.js"></script>
    
        
        <script src="../../gitbook/gitbook-plugin-chapter-fold/chapter-fold.js"></script>
        
    
        
        <script src="../../gitbook/gitbook-plugin-search-pro/jquery.mark.min.js"></script>
        
    
        
        <script src="../../gitbook/gitbook-plugin-search-pro/search.js"></script>
        
    
        
        <script src="../../gitbook/gitbook-plugin-splitter/splitter.js"></script>
        
    
        
        <script src="../../gitbook/gitbook-plugin-back-to-top-button/plugin.js"></script>
        
    
        
        <script src="../../gitbook/gitbook-plugin-hide-element/plugin.js"></script>
        
    
        
        <script src="../../gitbook/gitbook-plugin-code/plugin.js"></script>
        
    
        
        <script src="../../gitbook/gitbook-plugin-livereload/plugin.js"></script>
        
    
        
        <script src="../../gitbook/gitbook-plugin-sharing/buttons.js"></script>
        
    
        
        <script src="../../gitbook/gitbook-plugin-fontsettings/fontsettings.js"></script>
        
    
        
        <script src="../../gitbook/gitbook-plugin-theme-fexa/fexa.js"></script>
        
    

    </body>
</html>

